/ Hex Artifact Content
Login

Artifact 62fc49f212276891085693c47eb6c3dc0fb1b197:


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 36 30 20 32 30 30 39 2f 30  c,v 1.660 2009/0
0190: 37 2f 30 38 20 31 33 3a 35 35 3a 32 39 20 64 61  7/08 13:55:29 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 53 51 4c 49  LOCK..**.** SQLI
22f0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2300: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2310: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2320: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59  lly. SQLITE_BUSY
2330: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   and.** SQLITE_N
2340: 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65  OMEM may also be
2350: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2360: 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61 72  atic int setShar
2370: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2380: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
2390: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
23a0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
23b0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
23c0: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
23d0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
23e0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
23f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2400: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2410: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2420: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
2430: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2440: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
2450: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e   );..  /* A conn
2460: 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  ection with the 
2470: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
2480: 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e   flag set will n
2490: 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a  ever try to.  **
24a0: 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c   obtain a read-l
24b0: 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66  ock using this f
24c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c  unction. The onl
24d0: 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61  y read-lock obta
24e0: 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63  ined.  ** by a c
24f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61  onnection in rea
2500: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f  d-uncommitted mo
2510: 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c  de is on the sql
2520: 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a  ite_master .  **
2530: 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74   table, and that
2540: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
2550: 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54  d in BtreeBeginT
2560: 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73  rans().  */.  as
2570: 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d  sert( 0==(p->db-
2580: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2590: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
25a0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
25b0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
25c0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
25d0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
25e0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
25f0: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2600: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2620: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
2630: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
2640: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2650: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
2660: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ock) );..  /* Fi
2670: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
2680: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
2690: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
26a0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
26b0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
26c0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
26d0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
26e0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
26f0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
2700: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2710: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
2720: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
2730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2740: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
2750: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
2760: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
2770: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
2780: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
2790: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
27a0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
27b0: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
27c0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
27d0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
27e0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
27f0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
2800: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
2810: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
2820: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
2830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2840: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2850: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
2860: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
2870: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
2880: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
2890: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
28a0: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
28b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
28c0: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
28d0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
28e0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
28f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
2900: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
2910: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
2920: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
2930: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
2940: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
2950: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
2960: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
2970: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
2980: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
2990: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
29a0: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
29b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
29c0: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
29d0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
29e0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
29f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a10: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2a20: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2a30: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2a40: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2a50: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
2a60: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
2a70: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
2a80: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
2a90: 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61  to.** the setSha
2aa0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2ab0: 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68  k() procedure) h
2ac0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
2ad0: 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  dle p..**.** Thi
2ae0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2af0: 65 73 20 74 68 61 74 20 68 61 6e 64 6c 65 20 70  es that handle p
2b00: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61   has an open rea
2b10: 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74  d or write .** t
2b20: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69  ransaction. If i
2b30: 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e  t does not, then
2b40: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 69 73   the BtShared.is
2b50: 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62 6c 65  Pending variable
2b60: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
2b70: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
2b80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2b90: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
2ba0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
2bb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
2bc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2bd0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
2be0: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
2bf0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
2c00: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2c10: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2c20: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2c30: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
2c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
2c50: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
2c60: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
2c70: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
2c80: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
2c90: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
2ca0: 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2cb0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
2cc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a  Lock->pBtree );.
2cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
2ce0: 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61  k->pBtree->inTra
2cf0: 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ns>=pLock->eLock
2d00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
2d10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
2d20: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
2d30: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
2d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
2d50: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20  k->iTable!=1 || 
2d60: 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20  pLock==&p->lock 
2d70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
2d80: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b  ck->iTable!=1 ){
2d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2da0: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
2db0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2dc0: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
2dd0: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
2de0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
2df0: 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64 69  rt( pBt->isPendi
2e00: 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ng==0 || pBt->pW
2e10: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
2e20: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
2e30: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
2e40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
2e50: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
2e60: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
2e70: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ding = 0;.  }els
2e80: 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e  e if( pBt->nTran
2e90: 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20  saction==2 ){.  
2ea0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2eb0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
2ec0: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 69  n connection p i
2ed0: 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73  s concluding its
2ee0: 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
2ef0: 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63  tion. If there c
2f00: 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20  urrently exists 
2f10: 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20  a writer, and p 
2f20: 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68  is not.    ** th
2f30: 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20  at writer, then 
2f40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
2f50: 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
2f60: 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20  ections other.  
2f70: 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72    ** than the wr
2f80: 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f  iter must be abo
2f90: 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65  ut to drop to ze
2fa0: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
2fb0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20  .    ** set the 
2fc0: 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74  isPending flag t
2fd0: 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 0..    **.    
2fe0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
2ff0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77  ot currently a w
3000: 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68  riter, then BtSh
3010: 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d  ared.isPending m
3020: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3030: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3040: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3050: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3060: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3070: 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e     pBt->isPendin
3080: 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  g = 0;.  }.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
30b0: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
30c0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 74  y connection p t
30d0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
30e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
30f0: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3100: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3110: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3120: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3130: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3140: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3150: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3160: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3170: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
3180: 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a  sExclusive = 0;.
3190: 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69      pBt->isPendi
31a0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ng = 0;.    for(
31b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
31c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
31d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
31e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
31f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3200: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3210: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3220: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3230: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3240: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3250: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3260: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3270: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3280: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3290: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
32a0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
32b0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
32c0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
32d0: 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20  olds a mutex on 
32e0: 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  the BtShared.*/.
32f0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
3300: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3310: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
3320: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
3330: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
3340: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
3350: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
3360: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3370: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
3380: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3390: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
33a0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63  list cache for c
33b0: 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61  ursor pCur, if a
33c0: 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ny..*/.static vo
33d0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  id invalidateOve
33e0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72  rflowCache(BtCur
33f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
3400: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
3410: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
3420: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3430: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
3440: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
3450: 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ow = 0;.}../*.**
3460: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3470: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
3480: 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c  st cache for all
3490: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
34a0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
34b0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
34c0: 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pBt..*/.static 
34d0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41  void invalidateA
34e0: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
34f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
3500: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
3510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3520: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
3530: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3540: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
3550: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3560: 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
3570: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b  verflowCache(p);
3580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3590: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35a0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
35b0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
35c0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
35d0: 2a 20 62 2d 74 72 65 65 20 74 6f 20 69 6e 76 61  * b-tree to inva
35e0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
35f0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3600: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3610: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3620: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3630: 20 6d 6f 64 69 66 69 65 64 2e 20 41 72 67 75 6d   modified. Argum
3640: 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20  ent pgnoRoot is 
3650: 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67  the .** root-pag
3660: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
3670: 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  -tree. .**.** If
3680: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3690: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
36a0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
36b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
36c0: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
36d0: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
36e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
36f0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3700: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3710: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3720: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3730: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3740: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3750: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3760: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3770: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3780: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3790: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
37a0: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
37b0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
37c0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
37d0: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
37e0: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
37f0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
3800: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3820: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3830: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3840: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3850: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3860: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3870: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
3880: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  oot,          /*
3890: 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63   Look for read c
38a0: 75 72 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62  ursors on this b
38b0: 74 72 65 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  tree */.  i64 iR
38c0: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
38d0: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
38e0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
38f0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3900: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3910: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3920: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3930: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3940: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
3950: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3960: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
3970: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3980: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
3990: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
39a0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
39b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
39c0: 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72     if( p->isIncr
39d0: 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 69  blobHandle && (i
39e0: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
39f0: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
3a00: 77 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  w) ){.      p->e
3a10: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
3a20: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20  NVALID;.    }.  
3a30: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 23 64 65  }.}..#else.  #de
3a40: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
3a50: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3a60: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3a70: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3a80: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3a90: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
3aa0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
3ab0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
3ac0: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
3ad0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
3ae0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3af0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
3b00: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
3b10: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
3b20: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
3b30: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
3b40: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
3b50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
3b60: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3b70: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
3b80: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
3b90: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
3ba0: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
3bb0: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
3bc0: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
3bd0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
3be0: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
3bf0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
3c00: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
3c10: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
3c20: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
3c30: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
3c40: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
3c50: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
3c60: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
3c70: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
3c80: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
3c90: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
3ca0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
3cb0: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
3cc0: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
3cd0: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
3ce0: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
3cf0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
3d00: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
3d10: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
3d20: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
3d30: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
3d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
3d50: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
3d60: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
3d70: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
3d80: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
3d90: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
3da0: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
3db0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
3dc0: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
3dd0: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
3de0: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
3df0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
3e00: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
3e10: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
3e20: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
3e30: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
3e40: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
3e50: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
3e60: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
3e70: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
3e80: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
3e90: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
3ea0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
3eb0: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
3ec0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
3ed0: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
3ee0: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
3ef0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
3f00: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
3f10: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
3f20: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
3f30: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
3f40: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
3f50: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
3f60: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
3f70: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
3f80: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
3f90: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
3fa0: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
3fb0: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
3fc0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
3fd0: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
3fe0: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
3ff0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
4000: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
4010: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
4020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
4030: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
4040: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4050: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4060: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4070: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4080: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4090: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
40a0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
40b0: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
40c0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
40d0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
40e0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
40f0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
4100: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
4110: 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74 65 64 20  ove is ommitted 
4120: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4130: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4140: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4150: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4160: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
4170: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4180: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4190: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
41a0: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
41b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
41c0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
41d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
41e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
41f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4200: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4210: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4220: 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
4230: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
4240: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
4250: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
4260: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4270: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4280: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4290: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
42a0: 72 65 61 74 65 28 28 75 33 32 29 6e 50 61 67 65  reate((u32)nPage
42b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 42  );.      if( !pB
42c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
42d0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
42e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
42f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4300: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4310: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4320: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4330: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4350: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4360: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4370: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4380: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4390: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
43a0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
43b0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
43c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
43d0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
43e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
43f0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4400: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4410: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4420: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4430: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4440: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4450: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4460: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4470: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4480: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4490: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
44a0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
44b0: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
44c0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
44d0: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
44e0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
44f0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4500: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4510: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4520: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4530: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4540: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4550: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4560: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4570: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4580: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4590: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
45a0: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
45b0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
45c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
45d0: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
45e0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
45f0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4600: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4610: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4620: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4630: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4640: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4650: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4660: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4670: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4680: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4690: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
46a0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
46b0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
46c0: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
46d0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
46e0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
46f0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
4700: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
4710: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
4720: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
4730: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
4740: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
4750: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
4760: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63  x(pCur) );..  rc
4770: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
4780: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
4790: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
47a0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
47b0: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
47c0: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
47d0: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
47e0: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
47f0: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
4800: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
4810: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
4820: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
4830: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
4840: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
4850: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
4860: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
4870: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
4880: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
4890: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
48a0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
48b0: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
48c0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
48d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
48e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
48f0: 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20  0]->intKey){.   
4900: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71   void *pKey = sq
4910: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e  lite3Malloc( (in
4920: 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  t)pCur->nKey );.
4930: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
4940: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4950: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
4960: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
4970: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
4980: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4990: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
49a0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
49b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
49c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
49d0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
49e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
49f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4a10: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
4a20: 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
4a30: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
4a40: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
4a50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4a60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
4a70: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4a80: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4a90: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
4aa0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
4ab0: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61        pCur->apPa
4ac0: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
4ad0: 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
4ae0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d   = -1;.    pCur-
4af0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
4b00: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
4b10: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
4b20: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
4b30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
4b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
4b50: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
4b60: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
4b70: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
4b80: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
4b90: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
4ba0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
4bb0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
4bc0: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
4bd0: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
4be0: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
4bf0: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
4c00: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
4c10: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
4c20: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
4c30: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
4c40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
4c50: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
4c60: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
4c70: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
4c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4c90: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
4ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
4cb0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
4cc0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
4cd0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4ce0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4cf0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
4d00: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
4d10: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
4d20: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
4d30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4d40: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
4d50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
4d60: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
4d70: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
4d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
4d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4da0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4db0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4dc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4dd0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
4de0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4df0: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
4e00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
4e10: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
4e20: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
4e30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4e40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
4e50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
4e60: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
4e70: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
4e80: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4e90: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
4ea0: 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  /*.** In this ve
4eb0: 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f  rsion of BtreeMo
4ec0: 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20  veto, pKey is a 
4ed0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63  packed index rec
4ee0: 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69  ord.** such as i
4ef0: 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  s generated by t
4f00: 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
4f10: 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b   opcode.  Unpack
4f20: 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61   the.** record a
4f30: 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72  nd then call Btr
4f40: 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
4f50: 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72  () to do the wor
4f60: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
4f70: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20   btreeMoveto(.  
4f80: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
4f90: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70      /* Cursor op
4fa0: 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20  en on the btree 
4fb0: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
4fc0: 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
4fd0: 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65  pKey,   /* Packe
4fe0: 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74 72  d key if the btr
4ff0: 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a  ee is an index *
5000: 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
5010: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
5020: 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65  er key for table
5030: 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79  s.  Size of pKey
5040: 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a   for indices */.
5050: 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20    int bias,     
5060: 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65        /* Bias se
5070: 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67 68  arch to the high
5080: 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70   end */.  int *p
5090: 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Res           /*
50a0: 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
50b0: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
50c0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
50d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
50e0: 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a   Status code */.
50f0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
5100: 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20   *pIdxKey;   /* 
5110: 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
5120: 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70  ey */.  char aSp
5130: 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20  ace[150];       
5140: 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65     /* Temp space
5150: 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74   for pIdxKey - t
5160: 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63  o avoid a malloc
5170: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65 79 20   */..  if( pKey 
5180: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  ){.    assert( n
5190: 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e  Key==(i64)(int)n
51a0: 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b  Key );.    pIdxK
51b0: 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
51c0: 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
51d0: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e  r->pKeyInfo, (in
51e0: 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20  t)nKey, pKey,.  
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65      aSpace, size
5220: 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20  of(aSpace));.   
5230: 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20   if( pIdxKey==0 
5240: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
5250: 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NOMEM;.  }else{.
5260: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
5270: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5280: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
5290: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
52a0: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
52b0: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
52c0: 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Key ){.    sqlit
52d0: 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61  e3VdbeDeleteUnpa
52e0: 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b  ckedRecord(pIdxK
52f0: 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey);.  }.  retur
5300: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
5310: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
5320: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
5330: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
5340: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
5350: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
5360: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5370: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
5380: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
5390: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
53a0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
53b0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
53c0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
53d0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
53e0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
53f0: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
5400: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
5410: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
5420: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
5430: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5440: 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
5450: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43  te3BtreeRestoreC
5460: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
5470: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5480: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5490: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
54a0: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
54b0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
54c0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
54d0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
54e0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
54f0: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
5500: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
5510: 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72  skip;.  }.  pCur
5520: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
5530: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
5540: 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43  = btreeMoveto(pC
5550: 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20  ur, pCur->pKey, 
5560: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
5570: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
5580: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5590: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
55a0: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
55b0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
55c0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
55d0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
55e0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
55f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5600: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
5610: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5620: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
5630: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5640: 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74  n(p) \.  (p->eSt
5650: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
5660: 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20  IRESEEK ? \.    
5670: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
5680: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
5690: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
56a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
56b0: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
56c0: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
56d0: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
56e0: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
56f0: 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73  sition it.** was
5700: 20 6c 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e   last placed at.
5710: 20 20 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f    Cursors can mo
5720: 76 65 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20  ve when the row 
5730: 74 68 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e  they are pointin
5740: 67 0a 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74  g.** at is delet
5750: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
5760: 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  r them..**.** Th
5770: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
5780: 6e 73 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ns an error code
5790: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
57a0: 65 73 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a  es wrong.  The.*
57b0: 2a 20 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d  * integer *pHasM
57c0: 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f  oved is set to o
57d0: 6e 65 20 69 66 20 74 68 65 20 63 75 72 73 6f 72  ne if the cursor
57e0: 20 68 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30   has moved and 0
57f0: 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20   if not..*/.int 
5800: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
5810: 6f 72 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72  orHasMoved(BtCur
5820: 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
5830: 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e  pHasMoved){.  in
5840: 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  t rc;..  rc = re
5850: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
5860: 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
5870: 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73   rc ){.    *pHas
5880: 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  Moved = 1;.    r
5890: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
58a0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
58b0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  !=CURSOR_VALID |
58c0: 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20  | pCur->skip!=0 
58d0: 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  ){.    *pHasMove
58e0: 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
58f0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
5900: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
5920: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5930: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
5940: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65  .** Given a page
5950: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67   number of a reg
5960: 75 6c 61 72 20 64 61 74 61 62 61 73 65 20 70 61  ular database pa
5970: 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70  ge, return the p
5980: 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f  age.** number fo
5990: 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  r the pointer-ma
59a0: 70 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  p page that cont
59b0: 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66  ains the entry f
59c0: 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20  or the.** input 
59d0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a  page number..*/.
59e0: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
59f0: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
5a00: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
5a10: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
5a20: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
5a30: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
5a40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5a50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
5a60: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e  t->mutex) );.  n
5a70: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
5a80: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
5a90: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
5aa0: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
5ab0: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
5ac0: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
5ad0: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
5ae0: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
5af0: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
5b00: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
5b10: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
5b20: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
5b30: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
5b40: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
5b50: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
5b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
5b70: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
5b80: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
5b90: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
5ba0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
5bb0: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
5bc0: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
5bd0: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
5be0: 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f  ..** An error co
5bf0: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  de is returned i
5c00: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
5c10: 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73   wrong, otherwis
5c20: 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  e SQLITE_OK..*/.
5c30: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
5c40: 70 50 75 74 28 42 74 53 68 61 72 65 64 20 2a 70  pPut(BtShared *p
5c50: 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38  Bt, Pgno key, u8
5c60: 20 65 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72   eType, Pgno par
5c70: 65 6e 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  ent){.  DbPage *
5c80: 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65  pDbPage;  /* The
5c90: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
5ca0: 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d  e */.  u8 *pPtrm
5cb0: 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ap;      /* The 
5cc0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61  pointer map data
5cd0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d   */.  Pgno iPtrm
5ce0: 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ap;     /* The p
5cf0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5d00: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
5d10: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a  offset;       /*
5d20: 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74   Offset in point
5d30: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
5d40: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
5d50: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
5d60: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
5d70: 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d  x) );.  /* The m
5d80: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61  aster-journal pa
5d90: 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e  ge number must n
5da0: 65 76 65 72 20 62 65 20 75 73 65 64 20 61 73 20  ever be used as 
5db0: 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  a pointer map pa
5dc0: 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
5dd0: 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45  0==PTRMAP_ISPAGE
5de0: 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59  (pBt, PENDING_BY
5df0: 54 45 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b  TE_PAGE(pBt)) );
5e00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ..  assert( pBt-
5e10: 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
5e20: 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20   if( key==0 ){. 
5e30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5e40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
5e50: 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50   }.  iPtrmap = P
5e60: 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
5e70: 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73  , key);.  rc = s
5e80: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
5e90: 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72  Bt->pPager, iPtr
5ea0: 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  map, &pDbPage);.
5eb0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5ec0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
5ed0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  n rc;.  }.  offs
5ee0: 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f  et = PTRMAP_PTRO
5ef0: 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b  FFSET(iPtrmap, k
5f00: 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65  ey);.  if( offse
5f10: 74 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  t<0 ){.    rc = 
5f20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5f30: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
5f40: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
5f50: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
5f60: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
5f70: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
5f80: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
5f90: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
5fa0: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
5fb0: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
5fc0: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
5fd0: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
5fe0: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
5ff0: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
6000: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
6010: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
6020: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
6030: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6040: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
6050: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
6060: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
6070: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
6080: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
6090: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 70 74 72  ;.    }.  }..ptr
60a0: 6d 61 70 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69  map_exit:.  sqli
60b0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
60c0: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
60d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
60e0: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
60f0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
6100: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
6110: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
6120: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
6130: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
6140: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
6150: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
6160: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
6170: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
6180: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
6190: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
61a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
61b0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
61c0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
61d0: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
61e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
61f0: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
6200: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
6210: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
6220: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
6230: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
6240: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
6250: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
6260: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
6270: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
6280: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
6290: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
62a0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
62b0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
62c0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
62d0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
62e0: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
62f0: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
6300: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
6310: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6320: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6330: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
6340: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
6350: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
6360: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
6370: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
6380: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
6390: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
63a0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
63b0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
63c0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
63d0: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
63e0: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
63f0: 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d  _PTROFFSET(iPtrm
6400: 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65  ap, key);.  asse
6410: 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b  rt( pEType!=0 );
6420: 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74  .  *pEType = pPt
6430: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  rmap[offset];.  
6440: 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67  if( pPgno ) *pPg
6450: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
6460: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
6470: 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
6480: 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
6490: 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c  ;.  if( *pEType<
64a0: 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29  1 || *pEType>5 )
64b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
64c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72  ORRUPT_BKPT;.  r
64d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
64e0: 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20  .}..#else /* if 
64f0: 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f  defined SQLITE_O
6500: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a  MIT_AUTOVACUUM *
6510: 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  /.  #define ptrm
6520: 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53  apPut(w,x,y,z) S
6530: 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69  QLITE_OK.  #defi
6540: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
6550: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
6560: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
6570: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 29  PutOvflPtr(x, y)
6580: 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69   SQLITE_OK.#endi
6590: 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  f../*.** Given a
65a0: 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20   btree page and 
65b0: 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20  a cell index (0 
65c0: 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20  means the first 
65d0: 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  cell on.** the p
65e0: 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65  age, 1 means the
65f0: 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e   second cell, an
6600: 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75  d so forth) retu
6610: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
6620: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
6630: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ent..**.** This 
6640: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e  routine works on
6650: 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61  ly for pages tha
6660: 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  t do not contain
6670: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
6680: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  .*/.#define find
6690: 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28  Cell(P,I) \.  ((
66a0: 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29  P)->aData + ((P)
66b0: 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74  ->maskPage & get
66c0: 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74  2byte(&(P)->aDat
66d0: 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65  a[(P)->cellOffse
66e0: 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a  t+2*(I)])))../*.
66f0: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
6700: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
6710: 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61  f findCell() tha
6720: 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70  t works for.** p
6730: 61 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e  ages that do con
6740: 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  tain overflow ce
6750: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  lls..*/.static u
6760: 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  8 *findOverflowC
6770: 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
6780: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
6790: 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
67a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
67b0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
67c0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
67d0: 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72  r(i=pPage->nOver
67e0: 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  flow-1; i>=0; i-
67f0: 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20  -){.    int k;. 
6800: 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43     struct _OvflC
6810: 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20  ell *pOvfl;.    
6820: 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e  pOvfl = &pPage->
6830: 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20  aOvfl[i];.    k 
6840: 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20  = pOvfl->idx;.  
6850: 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29    if( k<=iCell )
6860: 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69  {.      if( k==i
6870: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Cell ){.        
6880: 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43  return pOvfl->pC
6890: 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ell;.      }.   
68a0: 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20     iCell--;.    
68b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
68c0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
68d0: 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Cell);.}../*.** 
68e0: 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e  Parse a cell con
68f0: 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66  tent block and f
6900: 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49  ill in the CellI
6910: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
6920: 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f  There.** are two
6930: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
6940: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c  s function.  sql
6950: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
6960: 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a  ll() takes a .**
6970: 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74   cell index as t
6980: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6990: 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  nt and sqlite3Bt
69a0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
69b0: 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f  ) .** takes a po
69c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64  inter to the bod
69d0: 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73  y of the cell as
69e0: 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75   its second argu
69f0: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  ment..**.** With
6a00: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68  in this file, th
6a10: 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61  e parseCell() ma
6a20: 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  cro can be calle
6a30: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
6a40: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
6a50: 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e  eCellPtr(). Usin
6a60: 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73  g some compilers
6a70: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66  , this will be f
6a80: 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73  aster..*/.void s
6a90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
6aa0: 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61  CellPtr(.  MemPa
6ab0: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
6ac0: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
6ad0: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
6ae0: 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20  /.  u8 *pCell,  
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
6b00: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
6b10: 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65  ll text. */.  Ce
6b20: 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20  llInfo *pInfo   
6b30: 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e        /* Fill in
6b40: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
6b50: 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20  */.){.  u16 n;  
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20  /* Number bytes 
6b80: 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  in cell content 
6b90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
6ba0: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
6bb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6bc0: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
6bd0: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
6be0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6bf0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
6c00: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
6c10: 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20   pInfo->pCell = 
6c20: 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  pCell;.  assert(
6c30: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
6c40: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
6c50: 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65  1 );.  n = pPage
6c60: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
6c70: 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34    assert( n==4-4
6c80: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
6c90: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
6ca0: 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Key ){.    if( p
6cb0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b  Page->hasData ){
6cc0: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56  .      n += getV
6cd0: 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
6ce0: 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
6cf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
6d00: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
6d10: 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56   }.    n += getV
6d20: 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c  arint(&pCell[n],
6d30: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
6d40: 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  Key);.    pInfo-
6d50: 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61  >nData = nPayloa
6d60: 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
6d70: 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30  pInfo->nData = 0
6d80: 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61  ;.    n += getVa
6d90: 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d  rint32(&pCell[n]
6da0: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
6db0: 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e   pInfo->nKey = n
6dc0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70  Payload;.  }.  p
6dd0: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d  Info->nPayload =
6de0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
6df0: 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b  fo->nHeader = n;
6e00: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
6e10: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
6e20: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
6e30: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
6e40: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
6e50: 31 20 29 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  1 );.  if( likel
6e60: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
6e70: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
6e80: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
6e90: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
6ea0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
6eb0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
6ec0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
6ed0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
6ee0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
6ef0: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
6f00: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
6f10: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
6f20: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
6f30: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
6f40: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
6f50: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
6f60: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
6f70: 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  u16)nPayload;.  
6f80: 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c    pInfo->iOverfl
6f90: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ow = 0;.    if( 
6fa0: 28 6e 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20  (nSize & ~3)==0 
6fb0: 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  ){.      nSize =
6fc0: 20 34 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69   4;        /* Mi
6fd0: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
6fe0: 69 73 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  is 4 */.    }.  
6ff0: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
7000: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d   (u16)nSize;.  }
7010: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
7020: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
7030: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
7040: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
7050: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
7060: 20 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20     ** to decide 
7070: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72  how much to stor
7080: 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f  e locally and ho
7090: 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20  w much to spill 
70a0: 6f 6e 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72  onto.    ** over
70b0: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
70c0: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
70d0: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
70e0: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
70f0: 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76    ** space on ov
7100: 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69  erflow pages whi
7110: 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61  le keeping the a
7120: 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73  mount of local s
7130: 74 6f 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  torage.    ** in
7140: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
7150: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
7160: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7170: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
7180: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
7190: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
71a0: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
71b0: 20 20 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20      ** way will 
71c0: 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63  result in an inc
71d0: 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66  ompatible file f
71e0: 6f 72 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ormat..    */.  
71f0: 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20    int minLocal; 
7200: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75   /* Minimum amou
7210: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7220: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7230: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
7240: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
7250: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
7260: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
7270: 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20    int surplus;  
7280: 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79   /* Overflow pay
7290: 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66  load available f
72a0: 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  or local storage
72b0: 20 2a 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61   */..    minLoca
72c0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
72d0: 63 61 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61  cal;.    maxLoca
72e0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  l = pPage->maxLo
72f0: 63 61 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73  cal;.    surplus
7300: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e   = minLocal + (n
7310: 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63  Payload - minLoc
7320: 61 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d  al)%(pPage->pBt-
7330: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
7340: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
7350: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
7360: 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
7370: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
7380: 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66  ocal+1 );.    if
7390: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
73a0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70  Local ){.      p
73b0: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
73c0: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20  u16)surplus;.   
73d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
73e0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
73f0: 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  16)minLocal;.   
7400: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f   }.    pInfo->iO
7410: 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28  verflow = (u16)(
7420: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20  pInfo->nLocal + 
7430: 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  n);.    pInfo->n
7440: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
7450: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
7460: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
7470: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
7480: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
7490: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
74a0: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
74b0: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
74c0: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
74d0: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
74e0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
74f0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
7500: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
7510: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
7520: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
7530: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
7540: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
7550: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
7560: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
7570: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
7580: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
7590: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
75a0: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
75b0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
75c0: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
75d0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
75e0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
75f0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
7600: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
7610: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
7620: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
7630: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
7640: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
7650: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
7660: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
7670: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
7680: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
7690: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
76a0: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
76b0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
76c0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
76d0: 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65  lSizePtr(MemPage
76e0: 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65   *pPage, u8 *pCe
76f0: 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  ll){.  u8 *pIter
7700: 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d   = &pCell[pPage-
7710: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
7720: 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69    u32 nSize;..#i
7730: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7740: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
7750: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
7760: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
7770: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
7780: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
7790: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
77a0: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
77b0: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
77c0: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
77d0: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
77e0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
77f0: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
7800: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
7810: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
7820: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
7830: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
7840: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
7850: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
7860: 62 75 67 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74  buginfo;.  sqlit
7870: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
7880: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
7890: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
78a0: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 61  endif..  if( pPa
78b0: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
78c0: 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20    u8 *pEnd;.    
78d0: 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
78e0: 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  ta ){.      pIte
78f0: 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  r += getVarint32
7900: 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a  (pIter, nSize);.
7910: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
7920: 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20   nSize = 0;.    
7930: 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  }..    /* pIter 
7940: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
7950: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
7960: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
7970: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
7980: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
7990: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
79a0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
79b0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
79c0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
79d0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
79e0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
79f0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
7a00: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
7a10: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
7a20: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
7a30: 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
7a40: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
7a50: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
7a60: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 74 65 73  ize);.  }..  tes
7a70: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
7a80: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
7a90: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
7aa0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
7ab0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
7ac0: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
7ad0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
7ae0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
7af0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
7b00: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
7b10: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
7b20: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
7b30: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
7b40: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
7b50: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
7b60: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
7b70: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
7b80: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
7b90: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
7ba0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
7bb0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
7bc0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
7bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
7be0: 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69   += 4;.  }.  nSi
7bf0: 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65  ze += (u32)(pIte
7c00: 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f  r - pCell);..  /
7c10: 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69  * The minimum si
7c20: 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69  ze of any cell i
7c30: 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20  s 4 bytes. */.  
7c40: 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20  if( nSize<4 ){. 
7c50: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20     nSize = 4;.  
7c60: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69  }..  assert( nSi
7c70: 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53  ze==debuginfo.nS
7c80: 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ize );.  return 
7c90: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69  (u16)nSize;.}.#i
7ca0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
7cb0: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
7cc0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
7cd0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
7ce0: 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74  eturn cellSizePt
7cf0: 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c  r(pPage, findCel
7d00: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29  l(pPage, iCell))
7d10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
7d20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7d30: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
7d40: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65   If the cell pCe
7d50: 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65  ll, part of page
7d60: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
7d70: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
7d80: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
7d90: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
7da0: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
7db0: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
7dc0: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
7dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
7de0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
7df0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
7e00: 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65  u8 *pCell){.  Ce
7e10: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61  llInfo info;.  a
7e20: 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20  ssert( pCell!=0 
7e30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
7e40: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
7e50: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
7e60: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69  o);.  assert( (i
7e70: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
7e80: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
7e90: 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61  nKey))==info.nPa
7ea0: 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 69  yload );.  if( i
7eb0: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
7ec0: 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d  .    Pgno ovfl =
7ed0: 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
7ee0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
7ef0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74  );.    return pt
7f00: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
7f10: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
7f20: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
7f30: 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  e->pgno);.  }.  
7f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7f50: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
7f60: 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68  ** Defragment th
7f70: 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20 41  e page given.  A
7f80: 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76  ll Cells are mov
7f90: 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64  ed to the.** end
7fa0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e 64   of the page and
7fb0: 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20   all free space 
7fc0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74  is collected int
7fd0: 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65  o one.** big Fre
7fe0: 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72 73  eBlk that occurs
7ff0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
8000: 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a  header and cell.
8010: 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ** pointer array
8020: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
8030: 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73  ntent area..*/.s
8040: 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61 67  tatic int defrag
8050: 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65  mentPage(MemPage
8060: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
8070: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
8080: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8090: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
80a0: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pc;             
80b0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
80c0: 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c  s of a i-th cell
80d0: 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80f0: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
8100: 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f  e page header */
8110: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8130: 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20   Size of a cell 
8140: 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
8150: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
8160: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61  /* Number of usa
8170: 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70  ble bytes on a p
8180: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  age */.  int cel
8190: 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  lOffset;        
81a0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
81b0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
81c0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
81d0: 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
81e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
81f0: 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
8200: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
8210: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
8220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8230: 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
8240: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
8250: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8260: 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ta;       /* The
8270: 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
8280: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
8290: 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65  emp;       /* Te
82a0: 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c  mp area for cell
82b0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
82c0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
82d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
82e0: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
82f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
8300: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
8310: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
8320: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
8330: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
8340: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8350: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8360: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8370: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
8380: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
8390: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
83a0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
83b0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
83c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
83d0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
83e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
83f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8400: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8410: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
8420: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
8430: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
8440: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61  t->pPager);.  da
8450: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8460: 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  a;.  hdr = pPage
8470: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63  ->hdrOffset;.  c
8480: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67  ellOffset = pPag
8490: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
84a0: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
84b0: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
84c0: 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65   nCell==get2byte
84d0: 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29  (&data[hdr+3]) )
84e0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
84f0: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
8500: 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20  bleSize;.  cbrk 
8510: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8520: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63  [hdr+5]);.  memc
8530: 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c 20  py(&temp[cbrk], 
8540: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73 61  &data[cbrk], usa
8550: 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29 3b  bleSize - cbrk);
8560: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
8570: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
8580: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
8590: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
85a0: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
85b0: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
85c0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
85d0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
85e0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
85f0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
8600: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
8610: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8620: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8630: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8640: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8650: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
8660: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
8670: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
8680: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
8690: 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53  ITE_ENABLE_OVERS
86a0: 49 5a 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a  IZE_CELL_CHECK).
86b0: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
86c0: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
86d0: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
86e0: 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
86f0: 65 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20  eeInitPage().   
8700: 20 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 45 4e   ** if SQLITE_EN
8710: 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45  ABLE_OVERSIZE_CE
8720: 4c 4c 5f 43 48 45 43 4b 20 69 73 20 64 65 66 69  LL_CHECK is defi
8730: 6e 65 64 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ned .    */.    
8740: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
8750: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
8760: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
8770: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
8780: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23 65 6e  _BKPT;.    }.#en
8790: 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
87a0: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
87b0: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
87c0: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65  );.    size = ce
87d0: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
87e0: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
87f0: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 23   cbrk -= size;.#
8800: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8810: 45 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a  E_ENABLE_OVERSIZ
8820: 45 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20  E_CELL_CHECK).  
8830: 20 20 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c    if( cbrk<iCell
8840: 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20 72  First ){.      r
8850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8860: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
8870: 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 63  .#else.    if( c
8880: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
8890: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
88a0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
88b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
88c0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
88d0: 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
88e0: 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73  t( cbrk+size<=us
88f0: 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b  ableSize && cbrk
8900: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
8910: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 63 62      testcase( cb
8920: 72 6b 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53  rk+size==usableS
8930: 69 7a 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ize );.    testc
8940: 61 73 65 28 20 63 62 72 6b 3d 3d 69 43 65 6c 6c  ase( cbrk==iCell
8950: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
8960: 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65 3d 3d  tcase( pc+size==
8970: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
8980: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63    memcpy(&data[c
8990: 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d 2c  brk], &temp[pc],
89a0: 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74 32   size);.    put2
89b0: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
89c0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
89d0: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
89e0: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
89f0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
8a00: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
8a10: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
8a20: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+2] = 0;.  dat
8a30: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
8a40: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65  memset(&data[iCe
8a50: 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72  llFirst], 0, cbr
8a60: 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  k-iCellFirst);. 
8a70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8a80: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
8a90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
8aa0: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69   );.  if( cbrk-i
8ab0: 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65  CellFirst!=pPage
8ac0: 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72  ->nFree ){.    r
8ad0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8ae0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
8af0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8b00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
8b10: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
8b20: 20 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77   of space from w
8b30: 69 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ithin the B-Tree
8b40: 20 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20   page passed.** 
8b50: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
8b60: 75 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74  ument. Write int
8b70: 6f 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65  o *pIdx the inde
8b80: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
8b90: 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20  ata[].** of the 
8ba0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c  first byte of al
8bb0: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52  located space. R
8bc0: 65 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c  eturn either SQL
8bd0: 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20  ITE_OK or.** an 
8be0: 65 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61  error code (usua
8bf0: 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  lly SQLITE_CORRU
8c00: 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  PT)..**.** The c
8c10: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
8c20: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73   that there is s
8c30: 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
8c40: 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61  to make the.** a
8c50: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73  llocation.  This
8c60: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e   routine might n
8c70: 65 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e  eed to defragmen
8c80: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72  t in order to br
8c90: 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73  ing.** all the s
8ca0: 70 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68  pace together, h
8cb0: 6f 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f  owever.  This ro
8cc0: 75 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64  utine will avoid
8cd0: 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69   using.** the fi
8ce0: 72 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61  rst two bytes pa
8cf0: 73 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  st the cell poin
8d00: 74 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70  ter area since p
8d10: 72 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a  resumably this.*
8d20: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20  * allocation is 
8d30: 62 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72  being made in or
8d40: 64 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20  der to insert a 
8d50: 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20  new cell, so we 
8d60: 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64  will.** also end
8d70: 20 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65   up needing a ne
8d80: 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a  w cell pointer..
8d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
8da0: 6c 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50  locateSpace(MemP
8db0: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
8dc0: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78  nByte, int *pIdx
8dd0: 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
8de0: 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
8df0: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63  ffset;    /* Loc
8e00: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
8e10: 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a  e->hdrOffset */.
8e20: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74    u8 * const dat
8e30: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
8e40: 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  ;      /* Local 
8e50: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
8e60: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  aData */.  int n
8e70: 46 72 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  Frag;           
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 72 61  /* Number of fra
8ea0: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 6f 6e  gmented bytes on
8eb0: 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
8ec0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  top;            
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
8ef0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  f cell content a
8f00: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70  rea */.  int gap
8f10: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
8f20: 74 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65  t byte of gap be
8f30: 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74  tween cell point
8f40: 65 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e  ers and cell con
8f50: 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tent */.  int rc
8f60: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74  ;         /* Int
8f70: 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
8f80: 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
8f90: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
8fa0: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
8fb0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
8fc0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
8fd0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8fe0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8ff0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9000: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9010: 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a   nByte>=0 );  /*
9020: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
9030: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
9040: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
9050: 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73  e>=nByte );.  as
9060: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
9070: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
9080: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
9090: 2b 37 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  +7];.  assert( p
90a0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
90b0: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
90c0: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
90d0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
90e0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
90f0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 74 6f  age->nCell;.  to
9100: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
9110: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73  ta[hdr+5]);.  as
9120: 73 65 72 74 28 20 67 61 70 3c 3d 74 6f 70 20 29  sert( gap<=top )
9130: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67 61  ;.  testcase( ga
9140: 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65  p+2==top );.  te
9150: 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d 3d 74  stcase( gap+1==t
9160: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
9170: 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a 0a 20  ( gap==top );.. 
9180: 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 29   if( nFrag>=60 )
9190: 7b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  {.    /* Always 
91a0: 64 65 66 72 61 67 6d 65 6e 74 20 68 69 67 68 6c  defragment highl
91b0: 79 20 66 72 61 67 6d 65 6e 74 65 64 20 70 61 67  y fragmented pag
91c0: 65 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 64  es */.    rc = d
91d0: 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50  efragmentPage(pP
91e0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
91f0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9200: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
9210: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
9220: 20 20 7d 65 6c 73 65 20 69 66 28 20 67 61 70 2b    }else if( gap+
9230: 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 2f 2a  2<=top ){.    /*
9240: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
9250: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
9260: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
9270: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
9280: 66 79 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  fy .    ** the r
9290: 65 71 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f  equest. The allo
92a0: 63 61 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66  cation is made f
92b0: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 66 72  rom the first fr
92c0: 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20  ee slot in .    
92d0: 2a 2a 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  ** the list that
92e0: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
92f0: 20 74 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69   to accomadate i
9300: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  t..    */.    in
9310: 74 20 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20  t pc, addr;.    
9320: 66 6f 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20  for(addr=hdr+1; 
9330: 28 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26  (pc = get2byte(&
9340: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20  data[addr]))>0; 
9350: 61 64 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20  addr=pc){.      
9360: 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62  int size = get2b
9370: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
9380: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
9390: 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20   free slot */.  
93a0: 20 20 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42      if( size>=nB
93b0: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  yte ){.        i
93c0: 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42  nt x = size - nB
93d0: 79 74 65 3b 0a 20 20 20 20 20 20 20 20 74 65 73  yte;.        tes
93e0: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
93f0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9400: 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 20   x==3 );.       
9410: 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20   if( x<4 ){.    
9420: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
9430: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
9440: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
9450: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
9460: 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  f.          ** f
9470: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
9480: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
9490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65   */.          me
94a0: 6d 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d  mcpy(&data[addr]
94b0: 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b  , &data[pc], 2);
94c0: 0a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b  .          data[
94d0: 68 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46  hdr+7] = (u8)(nF
94e0: 72 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20  rag + x);.      
94f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9500: 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72     /* The slot r
9510: 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72  emains on the fr
9520: 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20  ee-list. Reduce 
9530: 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f  its size to acco
9540: 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unt.          **
9550: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
9560: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
9570: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
9580: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
9590: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
95a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
95b0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 70 63        *pIdx = pc
95c0: 20 2b 20 78 3b 0a 20 20 20 20 20 20 20 20 72 65   + x;.        re
95d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
95e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
95f0: 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  }..  /* Check to
9600: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   make sure there
9610: 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65   is enough space
9620: 20 69 6e 20 74 68 65 20 67 61 70 20 74 6f 20 73   in the gap to s
9630: 61 74 69 73 66 79 0a 20 20 2a 2a 20 74 68 65 20  atisfy.  ** the 
9640: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 49 66 20  allocation.  If 
9650: 6e 6f 74 2c 20 64 65 66 72 61 67 6d 65 6e 74 2e  not, defragment.
9660: 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
9670: 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74  ( gap+2+nByte==t
9680: 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b  op );.  if( gap+
9690: 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20  2+nByte>top ){. 
96a0: 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65     rc = defragme
96b0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
96c0: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
96d0: 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d  rn rc;.    top =
96e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
96f0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
9700: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
9710: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
9720: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
9730: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
9740: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
9750: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
9760: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
9770: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
9780: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
9790: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
97a0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
97b0: 6f 70 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74  op);.  *pIdx = t
97c0: 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  op;.  return SQL
97d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
97e0: 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69 6f   Return a sectio
97f0: 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d 3e  n of the pPage->
9800: 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72 65  aData to the fre
9810: 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69  elist..** The fi
9820: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
9830: 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  new free block i
9840: 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73  s pPage->aDisk[s
9850: 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65  tart].** and the
9860: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f   size of the blo
9870: 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79 74  ck is "size" byt
9880: 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f  es..**.** Most o
9890: 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65 72  f the effort her
98a0: 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e  e is involved in
98b0: 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61 63   coalesing adjac
98c0: 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63  ent.** free bloc
98d0: 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ks into a single
98e0: 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e   big free block.
98f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
9900: 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65  reeSpace(MemPage
9910: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74 61   *pPage, int sta
9920: 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20  rt, int size){. 
9930: 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67 69   int addr, pbegi
9940: 6e 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 69 4c  n, hdr;.  int iL
9950: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
9960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9970: 61 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20  argest possible 
9980: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
9990: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
99a0: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
99b0: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
99c0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
99d0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
99e0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
99f0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
9a00: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
9a10: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
9a20: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
9a30: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
9a40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
9a50: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
9a60: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9a70: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
9a80: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9a90: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9aa0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9ab0: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
9ac0: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
9ad0: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
9ae0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
9af0: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
9b00: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
9b10: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
9b20: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
9b30: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
9b40: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
9b50: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
9b60: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
9b70: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
9b80: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
9b90: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
9ba0: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
9bb0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
9bc0: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 2e  t of freeblocks.
9bd0: 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a 2a    Note that.  **
9be0: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
9bf0: 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20   freeblock list 
9c00: 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20 73  was checked by s
9c10: 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
9c20: 61 67 65 28 29 2c 0a 20 20 2a 2a 20 73 71 6c 69  age(),.  ** sqli
9c30: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
9c40: 28 29 20 64 69 64 20 6e 6f 74 20 64 65 74 65 63  () did not detec
9c50: 74 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 66 72  t overlapping fr
9c60: 65 65 62 6c 6f 63 6b 73 20 6f 72 0a 20 20 2a 2a  eeblocks or.  **
9c70: 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61 74   freeblocks that
9c80: 20 6f 76 65 72 6c 61 70 70 65 64 20 63 65 6c 6c   overlapped cell
9c90: 73 2e 20 20 49 66 20 74 68 65 72 65 20 77 61 73  s.  If there was
9ca0: 20 6f 76 65 72 6c 61 70 20 74 68 65 6e 0a 20 20   overlap then.  
9cb0: 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 69 6e  ** subsequent in
9cc0: 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73 20  sert operations 
9cd0: 6d 69 67 68 74 20 68 61 76 65 20 63 6f 72 72 75  might have corru
9ce0: 70 74 65 64 20 74 68 65 20 66 72 65 65 6c 69 73  pted the freelis
9cf0: 74 2e 0a 20 20 2a 2a 20 53 6f 20 77 65 20 64 6f  t..  ** So we do
9d00: 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
9d10: 6f 72 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 68  or corruption wh
9d20: 69 6c 65 20 73 63 61 6e 6e 69 6e 67 20 74 68 65  ile scanning the
9d30: 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
9d40: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
9d50: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
9d60: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 4c   = hdr + 1;.  iL
9d70: 61 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ast = pPage->pBt
9d80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
9d90: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67  ;.  while( (pbeg
9da0: 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  in = get2byte(&d
9db0: 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72  ata[addr]))<star
9dc0: 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b  t && pbegin>0 ){
9dd0: 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 3e  .    if( pbegin>
9de0: 69 4c 61 73 74 20 7c 7c 20 70 62 65 67 69 6e 3c  iLast || pbegin<
9df0: 61 64 64 72 2b 34 20 29 7b 0a 20 20 20 20 20 20  addr+4 ){.      
9e00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
9e10: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
9e20: 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65  }.    addr = pbe
9e30: 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  gin;.  }.  if( p
9e40: 62 65 67 69 6e 3e 69 4c 61 73 74 20 29 7b 0a 20  begin>iLast ){. 
9e50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9e60: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
9e70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62 65   }.  assert( pbe
9e80: 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67  gin>addr || pbeg
9e90: 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62  in==0 );.  put2b
9ea0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  yte(&data[addr],
9eb0: 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62   start);.  put2b
9ec0: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d  yte(&data[start]
9ed0: 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74  , pbegin);.  put
9ee0: 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72  2byte(&data[star
9ef0: 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70  t+2], size);.  p
9f00: 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
9f10: 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31  age->nFree + (u1
9f20: 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  6)size;..  /* Co
9f30: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
9f40: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
9f50: 20 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b   addr = hdr + 1;
9f60: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
9f70: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
9f80: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
9f90: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
9fa0: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
9fb0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
9fc0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
9fd0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
9fe0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
9ff0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
a000: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a010: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
a020: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
a030: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
a040: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
a050: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
a060: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
a070: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
a080: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
a090: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
a0a0: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
a0b0: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
a0c0: 5b 68 64 72 2b 37 5d 29 20 29 7b 0a 20 20 20 20  [hdr+7]) ){.    
a0d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a0e0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a0f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 61        }.      da
a100: 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 28 75 38  ta[hdr+7] -= (u8
a110: 29 66 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d  )frag;.      x =
a120: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a130: 70 6e 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70  pnext]);.      p
a140: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
a150: 65 67 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20  egin], x);.     
a160: 20 78 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74   x = pnext + get
a170: 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78  2byte(&data[pnex
a180: 74 2b 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a  t+2]) - pbegin;.
a190: 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
a1a0: 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20  data[pbegin+2], 
a1b0: 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  x);.    }else{. 
a1c0: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
a1d0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
a1e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
a1f0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
a200: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
a210: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
a220: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
a230: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
a240: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
a250: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
a260: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
a270: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
a280: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
a290: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
a2a0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
a2b0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
a2c0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
a2d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
a2e0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
a2f0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20  a[pbegin+2]);.  
a300: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
a310: 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20  [hdr+5], top);. 
a320: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
a330: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
a340: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
a350: 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  age) );.  return
a360: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
a370: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
a380: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
a390: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
a3a0: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
a3b0: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
a3c0: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
a3d0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
a3e0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
a3f0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
a400: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
a410: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
a420: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
a430: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
a440: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
a450: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
a460: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
a470: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
a480: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
a490: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
a4a0: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
a4b0: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
a4c0: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
a4d0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
a4e0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
a4f0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
a500: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
a510: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
a520: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
a530: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
a540: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
a550: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
a560: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
a570: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
a580: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
a590: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
a5a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
a5b0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
a5c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a5d0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
a5e0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
a5f0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
a600: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
a610: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
a620: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
a630: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
a640: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
a650: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
a660: 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79  Bt;.  if( flagBy
a670: 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54  te==(PTF_LEAFDAT
a680: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20  A | PTF_INTKEY) 
a690: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
a6a0: 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50  tKey = 1;.    pP
a6b0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70  age->hasData = p
a6c0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
a6d0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a6e0: 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a  = pBt->maxLeaf;.
a6f0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f      pPage->minLo
a700: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65  cal = pBt->minLe
a710: 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  af;.  }else if( 
a720: 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45  flagByte==PTF_ZE
a730: 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  RODATA ){.    pP
a740: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b  age->intKey = 0;
a750: 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44  .    pPage->hasD
a760: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ata = 0;.    pPa
a770: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
a780: 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  Bt->maxLocal;.  
a790: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
a7a0: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  l = pBt->minLoca
a7b0: 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
a7c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a7d0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
a7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a7f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  OK;.}../*.** Ini
a800: 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69  tialize the auxi
a810: 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f  liary informatio
a820: 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f  n for a disk blo
a830: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
a840: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
a850: 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65  ccess.  If we se
a860: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
a870: 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74  does.** not cont
a880: 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  ain a well-forme
a890: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  d database page,
a8a0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a   then return .**
a8b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
a8c0: 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65    Note that a re
a8d0: 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f  turn of SQLITE_O
a8e0: 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75  K does not.** gu
a8f0: 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65  arantee that the
a900: 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f   page is well-fo
a910: 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73  rmed.  It only s
a920: 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20  hows that.** we 
a930: 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74  failed to detect
a940: 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e   any corruption.
a950: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
a960: 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d  treeInitPage(Mem
a970: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20  Page *pPage){.. 
a980: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a990: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
a9a0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a9b0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
a9c0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
a9d0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
a9e0: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
a9f0: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
aa00: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
aa10: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
aa20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
aa30: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
aa40: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
aa50: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
aa60: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
aa70: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
aa80: 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28  bPage) );..  if(
aa90: 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20   !pPage->isInit 
aaa0: 29 7b 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20  ){.    u16 pc;  
aab0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
aac0: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c  ress of a freebl
aad0: 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65  ock within pPage
aae0: 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20  ->aData[] */.   
aaf0: 20 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20   u8 hdr;        
ab00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
ab10: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61   beginning of pa
ab20: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  ge header */.   
ab30: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
ab40: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
ab50: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
ab60: 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
ab70: 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  t;        /* The
ab80: 20 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75   main btree stru
ab90: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36  cture */.    u16
aba0: 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20   usableSize;    
abb0: 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61  /* Amount of usa
abc0: 62 6c 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63  ble space on eac
abd0: 68 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31  h page */.    u1
abe0: 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  6 cellOffset;   
abf0: 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20   /* Offset from 
ac00: 73 74 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f  start of page to
ac10: 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e   first cell poin
ac20: 74 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e  ter */.    u16 n
ac30: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
ac40: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
ac50: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
ac60: 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74  age */.    u16 t
ac70: 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  op;           /*
ac80: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   First byte of t
ac90: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
aca0: 61 72 65 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20  area */.    int 
acb0: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
acc0: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
acd0: 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
ace0: 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
acf0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
ad00: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
ad10: 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  sible cell or fr
ad20: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
ad30: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
ad40: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
ad50: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
ad60: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
ad70: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
ad80: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
ad90: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
ada0: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
adb0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
adc0: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
add0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
ade0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
adf0: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
ae00: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
ae10: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
ae20: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
ae30: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
ae40: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
ae50: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ae60: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
ae70: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
ae80: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
ae90: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
aea0: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
aeb0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
aec0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
aed0: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
aee0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
aef0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
af00: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
af10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
af20: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
af30: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
af40: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
af50: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
af60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
af70: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
af80: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  }..    /* A malf
af90: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
afa0: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
afb0: 75 73 65 20 74 6f 20 72 65 61 64 20 70 61 73 74  use to read past
afc0: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
afd0: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
afe0: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
aff0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
b000: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
b010: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
b020: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
b030: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
b040: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
b050: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
b060: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
b070: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
b080: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
b090: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
b0a0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 43  s..    */.    iC
b0b0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
b0c0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
b0d0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 43 65 6c  >nCell;.    iCel
b0e0: 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53 69  lLast = usableSi
b0f0: 7a 65 20 2d 20 34 3b 0a 23 69 66 20 64 65 66 69  ze - 4;.#if defi
b100: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b110: 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f  E_OVERSIZE_CELL_
b120: 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20  CHECK).    {.   
b130: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
b140: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
b150: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
b160: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
b170: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
b180: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b190: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
b1a0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
b1b0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
b1c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b1d0: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
b1e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
b1f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b200: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32  a[cellOffset+i*2
b210: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
b220: 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
b230: 69 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  irst );.        
b240: 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
b250: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 20  ellLast );.     
b260: 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46     if( pc<iCellF
b270: 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c  irst || pc>iCell
b280: 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Last ){.        
b290: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b2a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b2b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b2c0: 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
b2d0: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
b2e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
b2f0: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
b300: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
b310: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
b320: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
b330: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
b340: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
b350: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b360: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
b370: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
b380: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
b390: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
b3a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
b3b0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
b3c0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
b3d0: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
b3e0: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
b3f0: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
b400: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
b410: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
b420: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
b430: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
b440: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b450: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b460: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
b470: 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65  block is off the
b480: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
b490: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b4a0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
b4b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74      }.      next
b4c0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
b4d0: 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69  a[pc]);.      si
b4e0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
b4f0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
b500: 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20    if( next>0 && 
b510: 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20  next<=pc+size+3 
b520: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72  ){.        /* Fr
b530: 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62  ee blocks must b
b540: 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  e in ascending o
b550: 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  rder */.        
b560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
b570: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
b580: 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65     }.      nFree
b590: 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b   = nFree + size;
b5a0: 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74  .      pc = next
b5b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b5c0: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
b5d0: 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
b5e0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
b5f0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
b600: 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  .    ** of the c
b610: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
b620: 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
b630: 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
b640: 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ithin.    ** the
b650: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
b660: 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67  ea. If this is g
b670: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
b680: 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20  usable-size.    
b690: 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20  ** of the page, 
b6a0: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75  then the page mu
b6b0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  st be corrupted.
b6c0: 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f   This check also
b6d0: 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74  .    ** serves t
b6e0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
b6f0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
b700: 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
b710: 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a  l-content.    **
b720: 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67   area, according
b730: 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61   to the page hea
b740: 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e  der, lies within
b750: 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a   the page..    *
b760: 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e  /.    if( nFree>
b770: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
b780: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b790: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
b7a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
b7b0: 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20  ->nFree = nFree 
b7c0: 2d 20 69 43 65 6c 6c 46 69 72 73 74 3b 0a 20 20  - iCellFirst;.  
b7d0: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
b7e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
b7f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b800: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72  /*.** Set up a r
b810: 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74 20  aw page so that 
b820: 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  it looks like a 
b830: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68 6f  database page ho
b840: 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72  lding.** no entr
b850: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
b860: 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d  oid zeroPage(Mem
b870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
b880: 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67   flags){.  unsig
b890: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
b8a0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
b8b0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
b8c0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75   pPage->pBt;.  u
b8d0: 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  8 hdr = pPage->h
b8e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20  drOffset;.  u16 
b8f0: 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  first;..  assert
b900: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
b910: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
b920: 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
b930: 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72  >pgno );.  asser
b940: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
b950: 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
b960: 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
b970: 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
b980: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b990: 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
b9a0: 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61  pDbPage) == data
b9b0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b9c0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b9d0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b9e0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
b9f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ba00: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
ba10: 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28  ) );.  /*memset(
ba20: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
ba30: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
ba40: 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b   hdr);*/.  data[
ba50: 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61  hdr] = (char)fla
ba60: 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64  gs;.  first = hd
ba70: 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67  r + 8 + 4*((flag
ba80: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
ba90: 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  1:0);.  memset(&
baa0: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
bab0: 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
bac0: 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
bad0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
bae0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
baf0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
bb00: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
bb10: 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65  ze - first;.  de
bb20: 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c  codeFlags(pPage,
bb30: 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65   flags);.  pPage
bb40: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64  ->hdrOffset = hd
bb50: 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  r;.  pPage->cell
bb60: 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
bb70: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
bb80: 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
bb90: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
bba0: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
bbb0: 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a  eSize<=32768 );.
bbc0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
bbd0: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
bbe0: 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e  e - 1;.  pPage->
bbf0: 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  nCell = 0;.  pPa
bc00: 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a  ge->isInit = 1;.
bc10: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  }.../*.** Conver
bc20: 74 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69  t a DbPage obtai
bc30: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ned from the pag
bc40: 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67  er into a MemPag
bc50: 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65  e used by.** the
bc60: 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f   btree layer..*/
bc70: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
bc80: 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62  *btreePageFromDb
bc90: 50 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62  Page(DbPage *pDb
bca0: 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  Page, Pgno pgno,
bcb0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b   BtShared *pBt){
bcc0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
bcd0: 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
bce0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
bcf0: 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70  ra(pDbPage);.  p
bd00: 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
bd10: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
bd20: 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
bd30: 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70  age->pDbPage = p
bd40: 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d  DbPage;.  pPage-
bd50: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50  >pBt = pBt;.  pP
bd60: 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  age->pgno = pgno
bd70: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
bd80: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67  fset = pPage->pg
bd90: 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
bda0: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
bdb0: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
bdc0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
bdd0: 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
bde0: 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
bdf0: 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
be00: 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
be10: 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  if needed..**.**
be20: 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e   If the noConten
be30: 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69  t flag is set, i
be40: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  t means that we 
be50: 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75  do not care abou
be60: 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
be70: 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
be80: 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64  this time.  So d
be90: 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20  o not go to the 
bea0: 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68  disk.** to fetch
beb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a   the content.  J
bec0: 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ust fill in the 
bed0: 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72  content with zer
bee0: 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49  os for now..** I
bef0: 66 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  f in the future 
bf00: 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  we call sqlite3P
bf10: 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74  agerWrite() on t
bf20: 68 69 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a  his page, that.*
bf30: 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20  * means we have 
bf40: 73 74 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f  started to be co
bf50: 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f  ncerned about co
bf60: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69  ntent and the di
bf70: 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c  sk.** read shoul
bf80: 64 20 6f 63 63 75 72 20 61 74 20 74 68 61 74 20  d occur at that 
bf90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  point..*/.int sq
bfa0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
bfb0: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
bfc0: 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
bfd0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
bfe0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
bff0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
c000: 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
c010: 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
c020: 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
c030: 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
c040: 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
c050: 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e  /.  int noConten
c060: 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  t        /* Do n
c070: 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e  ot load page con
c080: 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  tent if true */.
c090: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
c0a0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
c0b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c0c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c0d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
c0e0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c0f0: 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61  Acquire(pBt->pPa
c100: 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61  ger, pgno, (DbPa
c110: 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e  ge**)&pDbPage, n
c120: 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28  oContent);.  if(
c130: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
c140: 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72  .  *ppPage = btr
c150: 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
c160: 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
c170: 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pBt);.  return S
c180: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c190: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 70 61  ** Retrieve a pa
c1a0: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
c1b0: 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
c1c0: 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69  requested page i
c1d0: 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79  s not.** already
c1e0: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
c1f0: 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  che return NULL.
c200: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
c210: 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a  MemPage.pBt and.
c220: 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  ** MemPage.aData
c230: 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65   elements if nee
c240: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  ded..*/.static M
c250: 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
c260: 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64  eLookup(BtShared
c270: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
c280: 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  ){.  DbPage *pDb
c290: 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
c2a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c2b0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c2c0: 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71  ;.  pDbPage = sq
c2d0: 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
c2e0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
c2f0: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61  no);.  if( pDbPa
c300: 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
c310: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
c320: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
c330: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20  no, pBt);.  }.  
c340: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c350: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
c360: 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
c370: 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  se file in pages
c380: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
c390: 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72  y kind of.** err
c3a0: 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73  or, return ((uns
c3b0: 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a  igned int)-1)..*
c3c0: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 61  /.static Pgno pa
c3d0: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42 74 53  gerPagecount(BtS
c3e0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
c3f0: 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20  nt nPage = -1;. 
c400: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
c410: 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  t( pBt->pPage1 )
c420: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c430: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
c440: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
c450: 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  ge);.  assert( r
c460: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
c470: 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72  nPage==-1 );.  r
c480: 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67  eturn (Pgno)nPag
c490: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  e;.}../*.** Get 
c4a0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
c4b0: 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
c4c0: 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72  lize it.  This r
c4d0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73  outine.** is jus
c4e0: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20  t a convenience 
c4f0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
c500: 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f  eparate calls to
c510: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
c520: 47 65 74 50 61 67 65 28 29 20 61 6e 64 20 73 71  GetPage() and sq
c530: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
c540: 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ge()..*/.static 
c550: 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
c560: 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
c570: 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pBt,          /*
c580: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
c590: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
c5a0: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
c5b0: 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
c5c0: 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
c5d0: 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20  emPage **ppPage 
c5e0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
c5f0: 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65   page pointer he
c600: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
c610: 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
c620: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
c630: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c640: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c650: 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  ;.  if( pgno==0 
c660: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
c670: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
c680: 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  T; .  }..  /* It
c690: 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61   is often the ca
c6a0: 73 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  se that the page
c6b0: 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65   we want is alre
c6c0: 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20  ady in cache..  
c6d0: 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74  ** If so, get it
c6e0: 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73   directly.  This
c6f0: 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68   saves us from h
c700: 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20  aving to call.  
c710: 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  ** pagerPagecoun
c720: 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  t() to make sure
c730: 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20   pgno is within 
c740: 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65  limits, which re
c750: 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20  sults.  ** in a 
c760: 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65 72 66  measureable perf
c770: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
c780: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  ents..  */.  *pp
c790: 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62  Page = pPage = b
c7a0: 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
c7b0: 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  Bt, pgno);.  if(
c7c0: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a   pPage ){.    /*
c7d0: 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   Page is already
c7e0: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
c7f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c800: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
c810: 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63   Page not in cac
c820: 68 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e  he.  Acquire it.
c830: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f   */.    if( pgno
c840: 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
c850: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  pBt) ){.      re
c860: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c870: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
c880: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
c890: 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
c8a0: 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c  t, pgno, ppPage,
c8b0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
c8c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c8d0: 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65   pPage = *ppPage
c8e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
c8f0: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
c900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c910: 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
c920: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
c930: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c940: 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
c950: 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70 50 61  Page);.    *ppPa
c960: 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
c970: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c980: 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
c990: 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
c9a0: 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
c9b0: 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
c9c0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
c9d0: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a  e3BtreeGetPage..
c9e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
c9f0: 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
ca00: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
ca10: 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61  ( pPage ){.    a
ca20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
ca30: 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71  verflow==0 || sq
ca40: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
ca50: 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 44  fcount(pPage->pD
ca60: 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20 20 20  bPage)>1 );.    
ca70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
ca80: 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
ca90: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
caa0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
cab0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
cac0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
cad0: 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
cae0: 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ge );.    assert
caf0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
cb00: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
cb10: 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
cb20: 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
cb30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cb40: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
cb50: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
cb60: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
cb70: 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
cb80: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
cb90: 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
cba0: 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
cbb0: 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
cbc0: 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
cbd0: 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
cbe0: 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
cbf0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
cc00: 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
cc10: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
cc20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
cc30: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
cc40: 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
cc50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
cc60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
cc70: 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
cc80: 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
cc90: 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
cca0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
ccb0: 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
ccc0: 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
ccd0: 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
cce0: 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
ccf0: 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
cd00: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
cd10: 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
cd20: 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
cd30: 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
cd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cd50: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
cd60: 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
cd70: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
cd80: 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
cd90: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
cda0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
cdb0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
cdc0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
cdd0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
cde0: 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
cdf0: 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
ce00: 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
ce10: 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
ce20: 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
ce30: 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
ce40: 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
ce50: 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
ce60: 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
ce70: 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
ce80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
ce90: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
cea0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
ceb0: 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
cec0: 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
ced0: 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
cee0: 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
cef0: 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
cf00: 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
cf10: 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
cf20: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42       ** sqlite3B
cf30: 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 62  treeInitPage() b
cf40: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72  e called on ever
cf50: 79 20 62 74 72 65 65 20 70 61 67 65 20 73 6f 20  y btree page so 
cf60: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a  we make.      **
cf70: 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76   the call for ev
cf80: 65 72 79 20 70 61 67 65 20 74 68 61 74 20 63 6f  ery page that co
cf90: 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e  mes in for re-in
cfa0: 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  iting. */.      
cfb0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
cfc0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
cfd0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
cfe0: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
cff0: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
d000: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
d010: 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  nt btreeInvokeBu
d020: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a  syHandler(void *
d030: 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65  pArg){.  BtShare
d040: 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72  d *pBt = (BtShar
d050: 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65  ed*)pArg;.  asse
d060: 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20  rt( pBt->db );. 
d070: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d080: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
d090: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
d0a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49   return sqlite3I
d0b0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
d0c0: 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48  (&pBt->db->busyH
d0d0: 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  andler);.}../*.*
d0e0: 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73  * Open a databas
d0f0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a  e file..** .** z
d100: 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20  Filename is the 
d110: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
d120: 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a  base file.  If z
d130: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
d140: 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61  .** a new databa
d150: 73 65 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d  se with a random
d160: 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74 65 64   name is created
d170: 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79  .  This randomly
d180: 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61   named.** databa
d190: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
d1a0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c  deleted when sql
d1b0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
d1c0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49   is called..** I
d1d0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
d1e0: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
d1f0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
d200: 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
d210: 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
d220: 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
d230: 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
d240: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  osed..**.** If t
d250: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  he database is a
d260: 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e  lready opened in
d270: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
d280: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
d290: 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73   and we are in s
d2a0: 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65  hared cache mode
d2b0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20  , then the open 
d2c0: 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61  will fail with a
d2d0: 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53  n.** SQLITE_CONS
d2e0: 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57  TRAINT error.  W
d2f0: 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74  e cannot allow t
d300: 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61  wo or more BtSha
d310: 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69  red.** objects i
d320: 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
d330: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ase connection s
d340: 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69  ince doing so wi
d350: 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72  ll lead.** to pr
d360: 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b  oblems with lock
d370: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ing..*/.int sqli
d380: 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20  te3BtreeOpen(.  
d390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
d3a0: 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
d3b0: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
d3c0: 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65  aining the BTree
d3d0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73   database */.  s
d3e0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
d3f0: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
d400: 61 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61  ated database ha
d410: 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20  ndle */.  Btree 
d420: 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20  **ppBtree,      
d430: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d440: 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74  new Btree object
d450: 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f   written here */
d460: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
d470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
d480: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76  tions */.  int v
d490: 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  fsFlags         
d4a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
d4b0: 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71  ed through to sq
d4c0: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
d4d0: 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ) */.){.  sqlite
d4e0: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
d4f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d500: 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74  VFS to use for t
d510: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
d520: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
d530: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d540: 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
d550: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
d560: 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d580: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
d590: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
d5a0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
d5b0: 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
d5c0: 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
d5d0: 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
d5e0: 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
d5f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
d600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d610: 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
d620: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
d630: 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
d640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d650: 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
d660: 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
d670: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
d680: 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
d690: 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
d6a0: 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
d6b0: 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65  tent */..  /* Se
d6c0: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
d6d0: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
d6e0: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
d6f0: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
d700: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
d710: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
d720: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
d730: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
d740: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
d750: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
d760: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
d770: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
d780: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
d790: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
d7a0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
d7b0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
d7c0: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
d7d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
d7e0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
d7f0: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
d800: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
d810: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
d820: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
d830: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
d840: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
d850: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
d860: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
d870: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
d880: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
d890: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
d8a0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
d8b0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
d8c0: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62   );..  pVfs = db
d8d0: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
d8e0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
d8f0: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
d900: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
d910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d920: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
d930: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
d940: 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
d950: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d960: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
d970: 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  HE.  p->lock.pBt
d980: 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f  ree = p;.  p->lo
d990: 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23  ck.iTable = 1;.#
d9a0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
d9b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d9c0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
d9d0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d9e0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
d9f0: 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  /*.  ** If this 
da00: 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69  Btree is a candi
da10: 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20  date for shared 
da20: 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69  cache, try to fi
da30: 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74  nd an.  ** exist
da40: 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a  ing BtShared obj
da50: 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20  ect that we can 
da60: 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a  share with.  */.
da70: 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d 3d 30    if( isMemdb==0
da80: 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26   && zFilename &&
da90: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
daa0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
dab0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
dac0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
dad0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
dae0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
daf0: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
db00: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
db10: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
db20: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
db30: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
db40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
db50: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
db60: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
db70: 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   1;.      db->fl
db80: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
db90: 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20  aredCache;.     
dba0: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
dbb0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
dbc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
dbd0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
dbe0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dbf0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
dc00: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
dc10: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
dc20: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
dc30: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
dc40: 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e  .      mutexOpen
dc50: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
dc60: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
dc70: 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a  X_STATIC_OPEN);.
dc80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
dc90: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f  tex_enter(mutexO
dca0: 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  pen);.      mute
dcb0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
dcc0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
dcd0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
dce0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
dcf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
dd00: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
dd10: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
dd20: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
dd30: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
dd40: 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
dd50: 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
dd60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
dd70: 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
dd80: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
dd90: 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
dda0: 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
ddb0: 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
ddc0: 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20  ger)).          
ddd0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
dde0: 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
ddf0: 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
de00: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
de10: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
de20: 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
de30: 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
de40: 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
de50: 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
de60: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
de70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
de80: 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
de90: 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
dea0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
deb0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
dec0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
ded0: 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
dee0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
def0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
df00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
df10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
df20: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
df30: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
df40: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
df50: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
df60: 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
df70: 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
df80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
df90: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
dfa0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
dfb0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
dfc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
dfd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
dfe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
dff0: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
e000: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
e010: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
e020: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e030: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
e040: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
e050: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
e060: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
e070: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
e080: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
e090: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
e0a0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
e0b0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
e0c0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
e0d0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
e0e0: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
e0f0: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
e100: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
e110: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
e120: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
e130: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
e140: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
e150: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
e160: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
e170: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
e180: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
e190: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
e1a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
e1b0: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
e1c0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
e1d0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
e1e0: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
e1f0: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
e200: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
e210: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
e220: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
e230: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
e240: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
e250: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
e260: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
e270: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
e280: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e290: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
e2a0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
e2b0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
e2c0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
e2d0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
e2e0: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
e2f0: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
e300: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
e310: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
e320: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
e330: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
e340: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
e350: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
e360: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
e370: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
e380: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
e390: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
e3a0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e3b0: 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
e3c0: 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
e3d0: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
e3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3f0: 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
e400: 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
e410: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
e420: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e440: 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
e450: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
e460: 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
e470: 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
e480: 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
e490: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
e4a0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e4b0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
e4c0: 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
e4d0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
e4e0: 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
e4f0: 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
e500: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
e510: 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
e520: 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
e530: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e540: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
e550: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
e560: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
e570: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
e580: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
e590: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
e5a0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
e5b0: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
e5c0: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
e5d0: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
e5e0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
e5f0: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
e600: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
e610: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
e620: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
e630: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
e640: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
e650: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
e660: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
e670: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
e680: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e690: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e6a0: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
e6b0: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
e6c0: 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61  mory:" will crea
e6d0: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
e6e0: 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20  database, then. 
e6f0: 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68       ** leave th
e700: 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64  e autoVacuum mod
e710: 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61  e at 0 (do not a
e720: 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65  uto-vacuum), eve
e730: 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51  n if.      ** SQ
e740: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
e750: 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e  OVACUUM is true.
e760: 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
e770: 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  nd, if.      ** 
e780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
e790: 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65  RYDB has been de
e7a0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65  fined, then ":me
e7b0: 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61  mory:" is just a
e7c0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61  .      ** regula
e7d0: 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20  r file-name. In 
e7e0: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75  this case the au
e7f0: 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65  to-vacuum applie
e800: 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e  s as per normal.
e810: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
e820: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
e830: 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20   !isMemdb ){.   
e840: 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61       pBt->autoVa
e850: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
e860: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
e870: 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  M ? 1 : 0);.    
e880: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
e890: 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
e8a0: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
e8b0: 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  ==2 ? 1 : 0);.  
e8c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
e8d0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b     nReserve = 0;
e8e0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e8f0: 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62    nReserve = zDb
e900: 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20  Header[20];.    
e910: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
e920: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
e930: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e940: 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70  TOVACUUM.      p
e950: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
e960: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
e970: 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29  eader[36 + 4*4])
e980: 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74  ?1:0);.      pBt
e990: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
e9a0: 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
e9b0: 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  der[36 + 7*4])?1
e9c0: 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  :0);.#endif.    
e9d0: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
e9e0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
e9f0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
ea00: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
ea10: 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69  nReserve);.    i
ea20: 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72  f( rc ) goto btr
ea30: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
ea40: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
ea50: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
ea60: 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20   - nReserve;.   
ea70: 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70   assert( (pBt->p
ea80: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
ea90: 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c  );  /* 8-byte al
eaa0: 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53  ignment of pageS
eab0: 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21  ize */.   .#if !
eac0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
ead0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
eae0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
eaf0: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
eb00: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
eb10: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
eb20: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
eb30: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
eb40: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
eb50: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
eb60: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
eb70: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
eb80: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
eb90: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
eba0: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
ebb0: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
ebc0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
ebd0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
ebe0: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
ebf0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
ec00: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
ec10: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
ec20: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
ec30: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
ec40: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ec50: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
ec60: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
ec70: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
ec80: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
ec90: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
eca0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
ecb0: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
ecc0: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
ecd0: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
ece0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
ecf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ed00: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
ed10: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
ed20: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
ed30: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
ed40: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
ed50: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
ed60: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
ed70: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
ed80: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
ed90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
eda0: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
edb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
edc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
edd0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
ede0: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
edf0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
ee00: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
ee10: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
ee20: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
ee30: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
ee40: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
ee50: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
ee60: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
ee70: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
ee80: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
ee90: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
eea0: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
eeb0: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
eec0: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
eed0: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
eee0: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
eef0: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
ef00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
ef10: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
ef20: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
ef30: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
ef40: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
ef50: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
ef60: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
ef70: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
ef80: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
ef90: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
efa0: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
efb0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
efc0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
efd0: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
efe0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
eff0: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
f000: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f010: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
f020: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
f030: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
f040: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
f050: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
f060: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
f070: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
f080: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
f090: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
f0a0: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
f0b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
f0c0: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
f0d0: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
f0e0: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
f0f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f100: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
f110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f120: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f130: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
f140: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
f150: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
f160: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
f170: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
f180: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
f190: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
f1a0: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
f1b0: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
f1c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f1d0: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
f1e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
f1f0: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
f200: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74  0;.  }.  if( mut
f210: 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73  exOpen ){.    as
f220: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f230: 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70  tex_held(mutexOp
f240: 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  en) );.    sqlit
f250: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
f260: 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20  utexOpen);.  }. 
f270: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f280: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
f290: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
f2a0: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
f2b0: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
f2c0: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
f2d0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
f2e0: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
f2f0: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
f300: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
f310: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
f320: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
f330: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
f340: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
f350: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
f360: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
f370: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
f380: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
f390: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
f3a0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
f3b0: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
f3c0: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
f3d0: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
f3e0: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
f3f0: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
f400: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
f410: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
f420: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
f430: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
f440: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
f450: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
f460: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f470: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
f480: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
f490: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
f4a0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
f4b0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
f4c0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
f4d0: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
f4e0: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
f4f0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f500: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
f510: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
f520: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
f530: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
f540: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
f550: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
f560: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
f570: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
f580: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
f590: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
f5a0: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
f5b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
f5c0: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
f5d0: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
f5e0: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
f5f0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
f600: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
f610: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
f620: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
f630: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
f640: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
f650: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
f660: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f670: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
f680: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
f690: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
f6a0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
f6b0: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
f6c0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
f6d0: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
f6e0: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
f6f0: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
f700: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
f710: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
f720: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
f730: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
f740: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
f750: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
f760: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
f770: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
f780: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
f790: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
f7a0: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
f7b0: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
f7c0: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
f7d0: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
f7e0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
f7f0: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
f800: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
f810: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
f820: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
f830: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
f840: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
f850: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
f860: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
f870: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
f880: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f890: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
f8a0: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
f8b0: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
f8c0: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
f8d0: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
f8e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f8f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
f900: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
f910: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
f920: 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74  p);.  pCur = pBt
f930: 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69  ->pCursor;.  whi
f940: 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  le( pCur ){.    
f950: 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d  BtCursor *pTmp =
f960: 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20   pCur;.    pCur 
f970: 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
f980: 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74     if( pTmp->pBt
f990: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
f9a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
f9b0: 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20  eCursor(pTmp);. 
f9c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
f9d0: 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69  ollback any acti
f9e0: 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ve transaction a
f9f0: 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64  nd free the hand
fa00: 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  le structure..  
fa10: 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  ** The call to s
fa20: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
fa30: 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20  ack() drops any 
fa40: 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  table-locks held
fa50: 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61   by.  ** this ha
fa60: 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ndle..  */.  sql
fa70: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
fa80: 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  k(p);.  sqlite3B
fa90: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20  treeLeave(p);.. 
faa0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
fab0: 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74   still other out
fac0: 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
fad0: 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65  ces to the share
fae0: 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72  d-btree.  ** str
faf0: 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e  ucture, return n
fb00: 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65  ow. The remainde
fb10: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64  r of this proced
fb20: 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a  ure cleans .  **
fb30: 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62   up the shared-b
fb40: 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tree..  */.  ass
fb50: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
fb60: 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b  ck==0 && p->lock
fb70: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  ed==0 );.  if( !
fb80: 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72  p->sharable || r
fb90: 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67  emoveFromSharing
fba0: 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20  List(pBt) ){.   
fbb0: 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e   /* The pBt is n
fbc0: 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20  o longer on the 
fbd0: 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f  sharing list, so
fbe0: 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20   we can access. 
fbf0: 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74     ** it without
fc00: 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20   having to hold 
fc10: 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a  the mutex..    *
fc20: 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f  *.    ** Clean o
fc30: 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ut and delete th
fc40: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
fc50: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  t..    */.    as
fc60: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72  sert( !pBt->pCur
fc70: 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  sor );.    sqlit
fc80: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
fc90: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
fca0: 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68  f( pBt->xFreeSch
fcb0: 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68  ema && pBt->pSch
fcc0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ema ){.      pBt
fcd0: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42  ->xFreeSchema(pB
fce0: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
fcf0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
fd00: 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ree(pBt->pSchema
fd10: 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
fd20: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
fd30: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
fd40: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
fd50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
fd60: 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
fd70: 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
fd80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
fd90: 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
fda0: 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
fdb0: 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
fdc0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
fdd0: 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
fde0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
fdf0: 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
fe00: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
fe10: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
fe20: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fe30: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d  * Change the lim
fe40: 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
fe50: 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77 65   of pages allowe
fe60: 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  d in the cache..
fe70: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  **.** The maximu
fe80: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63 68  m number of cach
fe90: 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20 74  e pages is set t
fea0: 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a 2a  o the absolute.*
feb0: 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  * value of mxPag
fec0: 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69 73  e.  If mxPage is
fed0: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20 70   negative, the p
fee0: 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65  ager will.** ope
fef0: 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f 75  rate asynchronou
ff00: 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e 6f  sly - it will no
ff10: 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73 79  t stop to do fsy
ff20: 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73 75  nc()s.** to insu
ff30: 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74 74  re data is writt
ff40: 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20 73  en to the disk s
ff50: 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a 2a  urface before.**
ff60: 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54 72   continuing.  Tr
ff70: 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c 6c  ansactions still
ff80: 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72 6f   work if synchro
ff90: 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a 20  nous is off,.** 
ffa0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
ffb0: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72 75   cannot be corru
ffc0: 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72 6f  pted if this pro
ffd0: 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73 2e  gram.** crashes.
ffe0: 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70 65    But if the ope
fff0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 72  rating system cr
10000 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20 69  ashes or there i
10010 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20 70  s.** an abrupt p
10020 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68 65  ower failure whe
10030 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  n synchronous is
10040 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62 61   off, the databa
10050 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 6c  se.** could be l
10060 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73  eft in an incons
10070 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65 63  istent and unrec
10080 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e 0a  overable state..
10090 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20 69  ** Synchronous i
100a0 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  s on by default 
100b0 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  so database corr
100c0 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a  uption is not.**
100d0 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72 72   normally a worr
100e0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
100f0 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69  3BtreeSetCacheSi
10100 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
10110 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
10120 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10130 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
10140 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10150 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
10160 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10170 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
10180 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65  te3PagerSetCache
10190 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
101a0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
101b0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
101c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
101d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
101e0 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
101f0 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
10200 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
10210 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
10220 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
10230 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
10240 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
10250 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
10260 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
10270 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
10280 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
10290 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
102a0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
102b0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
102c0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
102d0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
102e0 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
102f0 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
10300 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
10310 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
10320 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
10330 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
10340 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
10350 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
10360 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
10370 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
10380 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
10390 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
103a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
103b0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
103c0 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61 66  lite3BtreeSetSaf
103d0 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20 2a  etyLevel(Btree *
103e0 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  p, int level, in
103f0 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20 42  t fullSync){.  B
10400 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10410 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
10420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10430 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
10440 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
10450 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
10460 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 61  qlite3PagerSetSa
10470 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e 70  fetyLevel(pBt->p
10480 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66 75  Pager, level, fu
10490 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  llSync);.  sqlit
104a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
104b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
104c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
104d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
104e0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74   if the given bt
104f0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61  ree is set to sa
10500 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49  fety level 1.  I
10510 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
10520 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
10530 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72   no sync() occur
10540 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s on the disk fi
10550 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
10560 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61  te3BtreeSyncDisa
10570 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  bled(Btree *p){.
10580 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
10590 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
105a0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  rc;.  assert( sq
105b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
105c0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
105d0 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ;  .  sqlite3Btr
105e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
105f0 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74  sert( pBt && pBt
10600 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63  ->pPager );.  rc
10610 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e   = sqlite3PagerN
10620 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65  osync(pBt->pPage
10630 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  r);.  sqlite3Btr
10640 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
10660 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
10670 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
10680 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  AS) || !defined(
10690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
106a0 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  UM)./*.** Change
106b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
106c0 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
106d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
106e0 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
106f0 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
10700 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
10710 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
10720 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
10730 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
10740 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
10750 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
10760 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
10770 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
10780 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
10790 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
107a0 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
107b0 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
107c0 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
107d0 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
107e0 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
107f0 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
10800 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
10810 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
10820 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
10830 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
10840 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
10850 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
10860 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
10870 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
10880 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
10890 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
108a0 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
108b0 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
108c0 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
108d0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
108e0 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
108f0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
10900 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
10910 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
10920 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
10930 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
10940 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
10950 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
10960 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
10970 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 53 69   then the pageSi
10980 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69 73 20  zeFixed flag is 
10990 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  set so that the 
109a0 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64  page size.** and
109b0 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65   autovacuum mode
109c0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62   can no longer b
109d0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  e changed..*/.in
109e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
109f0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
10a00 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  *p, int pageSize
10a10 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c 20  , int nReserve, 
10a20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e 74  int iFix){.  int
10a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10a40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10a50 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
10a60 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d  ert( nReserve>=-
10a70 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  1 && nReserve<=2
10a80 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  55 );.  sqlite3B
10a90 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
10aa0 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  if( pBt->pageSiz
10ab0 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73 71  eFixed ){.    sq
10ac0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10ad0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
10ae0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
10af0 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
10b00 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
10b10 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
10b20 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
10b30 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
10b40 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
10b50 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
10b60 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
10b70 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
10b80 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
10b90 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
10ba0 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
10bb0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
10bc0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
10bd0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
10be0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
10bf0 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31 20 26  ( !pBt->pPage1 &
10c00 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  & !pBt->pCursor 
10c10 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
10c20 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65  Size = (u16)page
10c30 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
10c40 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
10c50 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
10c60 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
10c70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
10c80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
10c90 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
10ca0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
10cb0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
10cc0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
10cd0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 70 61  ( iFix ) pBt->pa
10ce0 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
10cf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10d00 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10d10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
10d20 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
10d30 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
10d40 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
10d50 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
10d60 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
10d70 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
10d80 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a  >pageSize;.}../*
10d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
10da0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
10db0 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
10dc0 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  nd of every page
10dd0 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74   that.** are int
10de0 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e  entually left un
10df0 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  used.  This is t
10e00 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70  he "reserved" sp
10e10 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73  ace that is.** s
10e20 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79  ometimes used by
10e30 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a   extensions..*/.
10e40 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10e50 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
10e60 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
10e70 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10e80 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
10e90 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
10ea0 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
10eb0 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
10ec0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10ed0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
10ee0 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
10ef0 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
10f00 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
10f10 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
10f20 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
10f30 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
10f40 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
10f50 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
10f60 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
10f70 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
10f80 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
10f90 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
10fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
10fb0 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
10fc0 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
10fd0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
10fe0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10ff0 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
11000 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
11010 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
11020 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
11030 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11040 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
11050 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
11060 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
11070 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
11080 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
11090 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
110a0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
110b0 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
110c0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
110d0 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
110e0 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
110f0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
11100 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
11110 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
11120 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
11130 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
11140 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
11150 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
11160 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
11170 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
11180 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
11190 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
111a0 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
111b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
111c0 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
111d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
111e0 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
111f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
11200 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
11210 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
11220 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
11230 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
11240 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
11250 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61  QLITE_OK;.  u8 a
11260 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75  v = (u8)autoVacu
11270 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  um;..  sqlite3Bt
11280 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
11290 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
112a0 46 69 78 65 64 20 26 26 20 28 61 76 20 3f 31 3a  Fixed && (av ?1:
112b0 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63  0)!=pBt->autoVac
112c0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
112d0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
112e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
112f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
11300 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42 74  av ?1:0;.    pBt
11310 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 61  ->incrVacuum = a
11320 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20  v==2 ?1:0;.  }. 
11330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
11340 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
11350 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  rc;.#endif.}../*
11360 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
11370 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75 74  alue of the 'aut
11380 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
11390 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63 75  ty. If auto-vacu
113a0 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65  um is .** enable
113b0 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e  d 1 is returned.
113c0 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f   Otherwise 0..*/
113d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
113e0 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eGetAutoVacuum(B
113f0 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65 66  tree *p){.#ifdef
11400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
11410 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
11420 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
11430 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20  M_NONE;.#else.  
11440 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
11450 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
11460 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21 70    rc = (.    (!p
11470 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
11480 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43  m)?BTREE_AUTOVAC
11490 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21  UUM_NONE:.    (!
114a0 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  p->pBt->incrVacu
114b0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
114c0 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42  CUUM_FULL:.    B
114d0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
114e0 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69  INCR.  );.  sqli
114f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
11500 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
11510 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
11520 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65 20  Get a reference 
11530 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68 65  to pPage1 of the
11540 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11550 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c   This will.** al
11560 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65 61  so acquire a rea
11570 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69  dlock on that fi
11580 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  le..**.** SQLITE
11590 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
115a0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
115b0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  the file is not 
115c0 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  a.** well-formed
115d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
115e0 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  then SQLITE_CORR
115f0 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e  UPT is returned.
11600 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20  .** SQLITE_BUSY 
11610 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
11620 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6c  he database is l
11630 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e  ocked.  SQLITE_N
11640 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72  OMEM.** is retur
11650 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75  ned if we run ou
11660 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f  t of memory. .*/
11670 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
11680 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20 2a  Btree(BtShared *
11690 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  pBt){.  int rc;.
116a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
116b0 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  1;.  int nPage;.
116c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
116d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
116e0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
116f0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
11700 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  e1==0 );.  rc = 
11710 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
11720 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
11730 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
11740 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
11750 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
11760 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
11770 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
11780 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
11790 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
117a0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
117b0 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
117c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
117d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
117e0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
117f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
11810 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
11820 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  led;.  }else if(
11830 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
11840 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  int pageSize;.  
11850 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
11860 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20  ;.    u8 *page1 
11870 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  = pPage1->aData;
11880 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11890 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28  _NOTADB;.    if(
118a0 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
118b0 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
118c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
118d0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
118e0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  led;.    }.    i
118f0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29  f( page1[18]>1 )
11900 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61  {.      pBt->rea
11910 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dOnly = 1;.    }
11920 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
11930 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
11940 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11950 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  iled;.    }..   
11960 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
11970 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
11980 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c  n must be exactl
11990 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20  y 25%.  And the 
119a0 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65  minimum.    ** e
119b0 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
119c0 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66   must be 12.5% f
119d0 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74  or both leaf-dat
119e0 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64  a and non-leaf-d
119f0 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ata..    ** The 
11a00 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
11a10 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
11a20 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
11a30 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
11a40 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
11a50 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
11a60 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
11a70 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
11a80 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
11a90 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
11aa0 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
11ab0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
11ac0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61  ed;.    }.    pa
11ad0 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74  geSize = get2byt
11ae0 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20  e(&page1[16]);. 
11af0 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a     if( ((pageSiz
11b00 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d  e-1)&pageSize)!=
11b10 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31  0 || pageSize<51
11b20 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51  2 ||.        (SQ
11b30 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
11b40 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65  ZE<32768 && page
11b50 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
11b60 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29  PAGE_SIZE).    )
11b70 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11b80 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11b90 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
11ba0 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
11bb0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c  ==0 );.    usabl
11bc0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
11bd0 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20   - page1[20];.  
11be0 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d    if( pageSize!=
11bf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  pBt->pageSize ){
11c00 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20  .      /* After 
11c10 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73  reading the firs
11c20 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
11c30 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20  tabase assuming 
11c40 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20  a page size.    
11c50 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64    ** of BtShared
11c60 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61  .pageSize, we ha
11c70 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68  ve discovered th
11c80 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
11c90 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74   is.      ** act
11ca0 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20  ually pageSize. 
11cb0 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
11cc0 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e  ase, leave pBt->
11cd0 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20  pPage1 at.      
11ce0 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  ** zero and retu
11cf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68  rn SQLITE_OK. Th
11d00 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61  e caller will ca
11d10 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
11d20 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20  .      ** again 
11d30 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
11d40 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20   page-size..    
11d50 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61    */.      relea
11d60 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
11d70 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c        pBt->usabl
11d80 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61  eSize = (u16)usa
11d90 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
11da0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
11db0 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u16)pageSize;.  
11dc0 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
11dd0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
11de0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
11df0 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
11e00 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
11e10 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
11e40 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
11e50 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
11e60 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11e70 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 72 65  failed;.      re
11e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11e90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
11ea0 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
11eb0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
11ec0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
11ed0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
11ee0 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
11ef0 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
11f00 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28 75 31  usableSize = (u1
11f10 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  6)usableSize;.#i
11f20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11f30 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
11f40 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
11f50 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
11f60 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
11f70 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
11f80 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
11f90 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
11fa0 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
11fb0 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
11fc0 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
11fd0 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
11fe0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
11ff0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
12000 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
12010 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
12020 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
12030 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
12040 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
12050 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
12060 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
12070 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
12080 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
12090 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
120a0 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
120b0 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
120c0 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
120d0 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
120e0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
120f0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
12100 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
12110 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
12120 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
12130 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
12140 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
12150 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
12160 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
12170 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
12180 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
12190 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
121a0 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
121b0 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
121c0 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
121d0 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
121e0 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
121f0 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
12200 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
12210 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73  Local = (pBt->us
12220 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f  ableSize-12)*64/
12230 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d  255 - 23;.  pBt-
12240 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >minLocal = (pBt
12250 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
12260 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *32/255 - 23;.  
12270 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70  pBt->maxLeaf = p
12280 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
12290 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   35;.  pBt->minL
122a0 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  eaf = (pBt->usab
122b0 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
122c0 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65 72 74  5 - 23;.  assert
122d0 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
122e0 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
122f0 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
12300 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
12310 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e1;.  return SQL
12320 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69  ITE_OK;..page1_i
12330 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65  nit_failed:.  re
12340 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
12350 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
12360 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72   = 0;.  return r
12370 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
12380 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
12390 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20  tanding cursors 
123a0 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69  and we are not i
123b0 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20  n the middle.** 
123c0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
123d0 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20   but there is a 
123e0 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
123f0 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
12400 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
12410 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74  unrefs the first
12420 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
12430 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68  abase file which
12440 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66   .** has the eff
12450 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67  ect of releasing
12460 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
12470 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
12480 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
12490 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
124a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
124b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
124c0 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
124d0 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
124e0 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
124f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12500 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12510 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
12520 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c  Bt->pCursor==0 |
12530 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
12540 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20  tion>TRANS_NONE 
12550 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  );.  if( pBt->in
12560 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
12570 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e  NS_NONE && pBt->
12580 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
12590 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
125a0 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
125b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
125c0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
125d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
125e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
125f0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
12600 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
12610 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
12620 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
12630 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
12640 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12650 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
12660 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
12670 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
12680 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
12690 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
126a0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
126b0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
126c0 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
126d0 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
126e0 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
126f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
12700 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12710 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12720 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
12730 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
12740 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
12750 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12760 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
12770 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12780 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
12790 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
127a0 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
127b0 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
127c0 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
127d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
127e0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
127f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
12800 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
12810 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
12820 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
12830 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
12840 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
12850 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
12860 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
12870 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
12880 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
12890 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
128a0 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
128b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
128c0 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
128d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
128e0 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
128f0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
12900 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
12910 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
12920 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
12930 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
12940 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
12950 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
12960 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
12970 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
12980 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
12990 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
129a0 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
129b0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
129c0 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
129d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
129e0 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
129f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
12a00 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
12a10 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
12a20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
12a30 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
12a40 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
12a50 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
12a60 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
12a70 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12a80 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12a90 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
12aa0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
12ab0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12ad0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
12ae0 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
12af0 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
12b00 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
12b10 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
12b20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
12b30 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
12b40 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
12b50 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
12b60 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12b70 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
12b80 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
12b90 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
12ba0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
12bb0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
12bc0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
12bd0 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
12be0 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
12bf0 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
12c00 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
12c10 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
12c20 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
12c30 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
12c40 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
12c50 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
12c60 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
12c70 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
12c80 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
12c90 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
12ca0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
12cb0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
12cc0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
12cd0 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
12ce0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12cf0 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
12d00 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
12d10 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
12d20 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
12d30 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
12d40 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
12d50 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
12d60 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
12d70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
12d80 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
12d90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12da0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
12db0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12dc0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
12dd0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12de0 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
12df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
12e00 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
12e10 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
12e20 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
12e30 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
12e40 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
12e50 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
12e60 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
12e70 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
12e80 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
12e90 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
12ea0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
12eb0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
12ec0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
12ed0 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
12ee0 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
12ef0 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
12f00 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
12f10 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
12f20 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
12f30 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
12f40 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
12f50 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
12f60 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12f70 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
12f80 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
12f90 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
12fa0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
12fb0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
12fc0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
12fd0 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
12fe0 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
12ff0 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
13000 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
13010 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
13020 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
13030 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
13040 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
13050 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
13060 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
13070 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
13080 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
13090 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
130a0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
130b0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
130c0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
130d0 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
130e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
130f0 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
13100 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
13110 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
13120 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
13130 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
13140 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
13150 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
13160 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13170 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
13180 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
13190 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
131a0 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
131b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
131c0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
131d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
131e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
131f0 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
13200 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
13210 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
13220 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
13230 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13240 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
13250 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
13260 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
13270 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
13280 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
13290 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
132a0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
132b0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
132c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
132d0 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
132e0 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
132f0 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
13300 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
13310 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
13320 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
13330 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
13340 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
13350 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
13360 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
13370 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
13380 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
13390 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
133a0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
133b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
133c0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
133d0 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
133e0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
133f0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
13400 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
13410 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
13420 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
13430 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
13440 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
13450 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
13460 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
13470 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
13480 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
13490 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
134a0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
134b0 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
134c0 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
134d0 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
134e0 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
134f0 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
13500 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
13510 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
13520 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
13530 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
13540 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
13550 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
13560 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
13570 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
13580 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
13590 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
135a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
135b0 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
135c0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
135d0 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
135e0 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
135f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
13600 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
13610 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
13620 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
13630 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
13640 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
13650 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13660 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
13670 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
13680 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
13690 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
136a0 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
136b0 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
136c0 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
136d0 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
136e0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
136f0 65 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53  ened. */.  if( S
13700 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
13710 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
13720 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
13730 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
13740 4f 43 4b 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  OCK)) ){.    got
13750 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
13760 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f   }..  do {.    /
13770 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
13780 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
13790 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
137a0 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
137b0 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
137c0 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
137d0 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
137e0 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
137f0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
13800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
13810 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
13820 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
13830 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
13840 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
13850 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
13860 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
13870 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
13880 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
13890 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
138a0 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
138b0 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
138c0 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
138d0 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
138e0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
138f0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
13900 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
13910 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
13920 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
13930 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
13940 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
13950 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13960 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13970 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
13980 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
13990 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
139a0 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
139b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
139c0 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
139d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
139e0 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
139f0 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
13a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13a10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13a20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
13a30 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
13a40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13a50 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
13a60 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13a70 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
13a80 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
13a90 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
13aa0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
13ab0 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
13ac0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
13ad0 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
13ae0 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
13af0 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
13b00 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
13b10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
13b20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
13b30 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
13b40 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
13b50 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
13b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13b70 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
13b80 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13b90 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
13ba0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
13bb0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
13bc0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13bd0 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
13be0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
13bf0 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
13c00 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
13c10 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
13c20 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
13c30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
13c40 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
13c50 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
13c60 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
13c70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
13c80 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
13c90 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
13ca0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13cb0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
13cc0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13cd0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13ce0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
13cf0 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
13d00 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
13d10 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
13d20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
13d30 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
13d40 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
13d50 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
13d60 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
13d70 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
13d80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13d90 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13da0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
13db0 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
13dc0 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
13dd0 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
13de0 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
13df0 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
13e00 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
13e10 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
13e20 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
13e30 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
13e40 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
13e50 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
13e60 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
13e70 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
13e80 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
13e90 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
13ea0 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
13eb0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
13ec0 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
13ed0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
13ee0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
13f00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13f10 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
13f20 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
13f30 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
13f40 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
13f50 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
13f60 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
13f70 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
13f80 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
13f90 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
13fa0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
13fb0 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
13fc0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
13fd0 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
13fe0 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
13ff0 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
14000 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
14010 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
14040 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
14050 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14070 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
14080 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
14090 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
140a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140b0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
140c0 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
140d0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
140e0 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
140f0 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
14100 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
14110 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
14120 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
14130 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14140 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
14150 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
14160 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
14170 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
14180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14190 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
141a0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
141b0 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
141c0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
141d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
141e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
141f0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
14200 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
14210 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
14220 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
14230 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
14240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14250 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
14260 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
14270 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
14280 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
14290 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
142a0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
142b0 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
142c0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
142d0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
142e0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
142f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14300 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
14310 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
14320 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
14330 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
14340 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
14350 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
14360 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14370 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14380 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
14390 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
143a0 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
143b0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
143c0 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
143d0 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
143e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
143f0 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
14400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14410 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
14420 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
14430 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
14440 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
14450 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
14460 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
14470 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
14480 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
14490 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
144a0 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
144b0 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
144c0 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
144d0 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
144e0 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
144f0 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
14500 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
14510 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
14520 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
14530 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
14540 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
14550 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14560 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
14570 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
14580 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
14590 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
145a0 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
145b0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
145c0 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
145d0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
145e0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
145f0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
14600 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
14610 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
14620 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
14630 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
14640 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
14650 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
14680 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
14690 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
146a0 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
146b0 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
146c0 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
146d0 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
146e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
146f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
14700 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
14710 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
14720 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
14730 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
14740 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
14750 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
14760 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
14770 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
14780 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
14790 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
147a0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
147b0 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
147c0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
147d0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
147e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
147f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14800 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
14810 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
14820 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
14830 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
14840 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
14850 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
14860 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
14870 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
14880 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
14890 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
148a0 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
148b0 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
148c0 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
148d0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
148e0 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
148f0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
14900 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
14910 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
14920 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nfo;.        sql
14930 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
14940 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
14950 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
14960 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
14970 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
14980 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
14990 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
149a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
149b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
149c0 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
149d0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
149e0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
149f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
14a00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14a10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14a20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
14a30 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
14a40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
14a50 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
14a60 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14a70 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14a80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14a90 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
14aa0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
14ab0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
14ac0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
14ad0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14ae0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14af0 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
14b00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
14b10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
14b20 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
14b30 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
14b40 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
14b50 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
14b60 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
14b70 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
14b80 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
14b90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14ba0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14bb0 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
14bc0 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
14bd0 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
14be0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
14bf0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
14c00 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
14c10 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
14c20 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
14c30 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
14c40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
14c50 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
14c60 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
14c70 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
14c80 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
14c90 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
14ca0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
14cb0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14cc0 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
14cd0 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
14ce0 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
14cf0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
14d00 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
14d10 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
14d20 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
14d30 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
14d40 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
14d50 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
14d60 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
14d70 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d   isCommit.){.  M
14d80 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
14d90 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
14da0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
14db0 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
14dc0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
14dd0 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
14de0 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
14df0 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
14e00 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
14e10 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
14e20 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
14e30 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
14e40 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
14e50 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
14e60 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
14e70 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
14e80 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
14e90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14ea0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
14ec0 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
14ed0 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
14ee0 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
14ef0 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
14f00 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
14f10 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
14f20 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
14f30 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
14f40 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
14f50 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
14f60 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
14f70 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
14f80 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
14f90 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
14fa0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
14fb0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
14fc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
14fd0 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
14fe0 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
14ff0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
15010 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
15020 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
15030 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
15040 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
15050 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
15060 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
15070 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
15080 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
15090 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
150a0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
150b0 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
150c0 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
150d0 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
150e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
150f0 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
15100 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
15110 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15120 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
15130 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
15140 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
15150 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
15160 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
15170 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
15180 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
15190 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
151a0 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
151b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
151c0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
151d0 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
151e0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
151f0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
15200 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
15210 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
15220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15240 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15250 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
15260 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
15270 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
15280 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
15290 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
152a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
152b0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
152c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
152d0 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
152e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
152f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15300 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15310 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
15320 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
15330 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
15340 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
15350 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
15360 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
15370 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
15380 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
15390 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
153a0 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
153b0 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
153c0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
153d0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
153e0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
153f0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
15400 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
15410 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
15420 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15430 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
15440 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
15450 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15460 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
15470 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15480 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15490 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
154a0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
154b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
154c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
154d0 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
154e0 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
154f0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
15500 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
15510 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
15520 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
15530 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15540 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
15550 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
15560 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
15570 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
15580 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15590 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
155a0 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
155b0 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
155c0 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
155d0 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
155e0 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
155f0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
15600 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
15610 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
15620 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
15630 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
15640 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
15650 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
15660 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
15670 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
15680 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
15690 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
156a0 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
156b0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
156c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
156d0 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
156e0 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
156f0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
15700 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
15710 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
15720 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
15730 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
15740 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
15750 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
15760 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
15770 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
15780 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
15790 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d  zero, the implem
157a0 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
157b0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
157c0 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
157d0 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
157e0 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
157f0 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
15800 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
15810 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
15820 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
15830 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
15840 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
15850 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
15860 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
15870 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s is complete..*
15880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
15890 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
158a0 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
158b0 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
158c0 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  Pg){.  Pgno nFre
158d0 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
158e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
158f0 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
15900 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
15910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
15920 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
15930 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
15940 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
15950 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
15960 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
15970 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
15980 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
15990 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
159a0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
159b0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
159c0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
159d0 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
159e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
159f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
15a00 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
15a10 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
15a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
15a30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
15a40 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
15a50 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
15a60 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
15a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15a90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15aa0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15ab0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
15ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15ad0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15ae0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15af0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
15b00 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
15b10 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
15b20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
15b30 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
15b40 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
15b50 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
15b60 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
15b70 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
15b80 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
15b90 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
15ba0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
15bb0 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
15bc0 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
15bd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
15be0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
15bf0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
15c00 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
15c10 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
15c20 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
15c30 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
15c40 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
15c50 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
15c60 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
15c70 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
15c80 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
15c90 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
15ca0 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
15cb0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
15cc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15cd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
15ce0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
15cf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
15d00 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
15d10 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
15d20 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
15d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
15d40 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
15d50 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
15d60 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15d70 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
15d80 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
15d90 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
15da0 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
15db0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15dc0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
15dd0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
15de0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
15df0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15e00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15e10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
15e20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
15e30 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
15e40 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
15e50 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
15e60 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
15e70 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
15e80 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
15e90 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
15ea0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
15eb0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
15ec0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
15ed0 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
15ee0 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
15ef0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
15f00 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
15f10 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
15f20 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
15f30 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
15f40 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
15f50 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
15f60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
15f70 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
15f80 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
15f90 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
15fa0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
15fb0 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
15fc0 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
15fd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15fe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15ff0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
16000 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
16010 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16030 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
16040 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
16050 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
16060 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
16070 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
16080 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
16090 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
160a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
160b0 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
160c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
160d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
160e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
160f0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
16100 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
16110 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
16120 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
16130 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
16140 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
16150 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16170 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16180 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16190 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
161a0 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
161b0 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
161c0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
161d0 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
161e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
161f0 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
16200 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
16210 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
16220 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
16230 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
16240 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
16250 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16260 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
16270 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
16280 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16290 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
162a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
162b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
162c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
162d0 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
162e0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
162f0 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
16300 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16320 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16340 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  }.      iLastPg-
16350 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
16360 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
16370 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
16380 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
16390 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
163a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
163b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
163c0 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
163d0 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
163e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
163f0 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
16400 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
16410 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
16420 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
16430 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
16440 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
16450 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
16460 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
16470 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
16480 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16490 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
164a0 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
164b0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
164c0 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
164d0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
164e0 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
164f0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
16500 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
16510 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
16520 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
16530 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
16540 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
16550 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16560 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
16570 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
16580 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
16590 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
165a0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
165b0 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
165c0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
165d0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
165e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
165f0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
16600 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
16610 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
16620 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
16630 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16640 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
16650 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16660 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16670 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16680 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
16690 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
166a0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
166b0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
166c0 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
166d0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
166e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
166f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
16700 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
16710 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
16720 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
16730 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
16740 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
16750 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
16760 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
16770 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
16780 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
16790 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
167a0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
167b0 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
167c0 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
167d0 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
167e0 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
167f0 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
16800 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
16810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16820 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
16830 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
16840 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
16850 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
16860 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
16870 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
16880 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16890 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
168a0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
168b0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
168c0 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
168d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
168e0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
168f0 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
16900 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67  gno nFin;.    Pg
16910 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67  no nFree;.    Pg
16920 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
16930 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20  Pgno iFree;.    
16940 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
16950 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
16960 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
16970 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
16980 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50  pBt);..    if( P
16990 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
169a0 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
169b0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
169c0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
169d0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
169e0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
169f0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
16a00 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
16a10 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
16a20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
16a30 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
16a40 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
16a50 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
16a60 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
16a70 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
16a80 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
16a90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16ab0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16ac0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
16ad0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
16ae0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
16af0 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d  );.    nPtrmap =
16b00 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
16b10 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
16b20 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f   nOrig)+pgsz/5)/
16b30 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46  (pgsz/5);.    nF
16b40 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
16b50 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
16b60 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
16b70 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16b80 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
16b90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16ba0 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
16bb0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  -;.    }.    whi
16bc0 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
16bd0 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
16be0 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
16bf0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
16c00 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
16c10 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e    }.    if( nFin
16c20 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
16c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16c40 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46  KPT;..    for(iF
16c50 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
16c60 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
16c70 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
16c80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
16c90 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
16ca0 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20   nFin, iFree);. 
16cb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
16cc0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
16cd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
16ce0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
16cf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16d00 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  OK;.      rc = s
16d10 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
16d20 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
16d30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
16d40 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
16d50 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
16d60 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
16d70 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
16d80 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
16d90 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16da0 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
16db0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69  pBt->pPager, nFi
16dc0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
16dd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16de0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16df0 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
16e00 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
16e10 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
16e20 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ==sqlite3PagerRe
16e30 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
16e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16e50 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
16e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16e70 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
16e80 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
16e90 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
16ea0 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
16eb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
16ec0 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
16ed0 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
16ee0 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
16ef0 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
16f00 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
16f10 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
16f20 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
16f30 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
16f40 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
16f50 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
16f60 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
16f70 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
16f80 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
16f90 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
16fa0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
16fb0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
16fc0 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
16fd0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
16fe0 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
16ff0 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
17000 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
17010 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
17020 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
17030 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
17040 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
17050 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
17060 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
17070 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
17080 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
17090 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
170a0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
170b0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
170c0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
170d0 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
170e0 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
170f0 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
17100 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
17110 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
17120 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
17130 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
17140 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
17150 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
17160 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
17170 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
17180 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
17190 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
171a0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
171b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
171c0 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
171d0 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
171e0 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
171f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17200 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
17210 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
17220 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
17230 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
17240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
17250 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
17260 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
17270 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
17280 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
17290 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
172a0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
172b0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
172c0 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
172d0 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
172e0 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
172f0 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
17300 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
17310 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
17320 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
17330 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
17340 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
17350 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
17360 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
17370 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
17380 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
17390 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
173a0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
173b0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
173c0 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
173d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
173e0 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
173f0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
17400 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17410 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
17420 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
17430 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
17440 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17450 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
17460 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
17470 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
17480 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
174a0 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
174b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
174c0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
174d0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
174e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
174f0 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
17500 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
17510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
17530 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
17540 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
17560 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
17570 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
17580 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
17590 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
175a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
175b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
175c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
175d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
175e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
175f0 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
17600 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
17610 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
17620 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
17630 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
17640 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
17650 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
17660 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
17670 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
17680 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17690 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
176a0 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  sr;.  assert( sq
176b0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
176c0 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a  utex(p) );..  /*
176d0 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 63 75   Search for a cu
176e0 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e 20 62  rsor held open b
176f0 79 20 74 68 69 73 20 62 2d 74 72 65 65 20 63 6f  y this b-tree co
17700 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65  nnection. If one
17710 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68   exists,.  ** th
17720 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
17730 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67  on will be downg
17740 72 61 64 65 64 20 74 6f 20 61 20 72 65 61 64 2d  raded to a read-
17750 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
17760 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  .  ** instead of
17770 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75   actually conclu
17780 64 65 64 2e 20 41 20 73 75 62 73 65 71 75 65 6e  ded. A subsequen
17790 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74  t call to Commit
177a0 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a  PhaseTwo() .  **
177b0 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77   or Rollback() w
177c0 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65 20 74  ill finish the t
177d0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
177e0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
177f0 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43  se.  */.  for(pC
17800 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  sr=pBt->pCursor;
17810 20 70 43 73 72 20 26 26 20 70 43 73 72 2d 3e 70   pCsr && pCsr->p
17820 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72 3d 70  Btree!=p; pCsr=p
17830 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61  Csr->pNext);.  a
17840 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30 20 7c  ssert( pCsr==0 |
17850 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  | p->inTrans>TRA
17860 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74  NS_NONE );..  bt
17870 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
17880 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70  nt(pBt);.  if( p
17890 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67  Csr ){.    downg
178a0 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
178b0 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
178c0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
178d0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
178e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
178f0 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
17900 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
17910 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
17920 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
17930 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
17940 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
17950 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
17960 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
17970 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
17980 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
17990 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
179a0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
179b0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
179c0 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
179d0 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
179e0 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
179f0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
17a00 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
17a10 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
17a20 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
17a30 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
17a40 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
17a50 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
17a60 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
17a70 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
17a80 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17a90 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
17aa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17ab0 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
17ac0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
17ad0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
17ae0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
17af0 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
17b00 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
17b10 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
17b20 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
17b30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
17b40 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
17b50 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
17b60 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17b70 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
17b80 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17b90 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
17ba0 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
17bb0 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
17bc0 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
17bd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17be0 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
17bf0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
17c00 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
17c10 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
17c20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
17c30 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
17c40 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
17c50 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
17c60 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
17c70 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
17c80 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
17c90 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17ca0 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
17cb0 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
17cc0 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
17cd0 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
17ce0 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
17cf0 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
17d00 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
17d10 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
17d20 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
17d30 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
17d40 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
17d50 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
17d60 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
17d70 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
17d80 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
17d90 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17da0 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
17db0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
17dc0 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
17dd0 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
17de0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
17df0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
17e00 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
17e10 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
17e20 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
17e30 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
17e40 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
17e50 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
17e60 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17e70 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
17e80 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17e90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17ea0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
17eb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
17ec0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
17ed0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
17ee0 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
17ef0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
17f00 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
17f10 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
17f20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
17f30 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
17f40 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
17f50 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
17f60 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
17f70 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
17f80 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
17f90 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17fa0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
17fb0 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
17fc0 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
17fd0 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
17fe0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17ff0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
18000 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
18010 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18020 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
18030 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18040 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18050 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
18060 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
18070 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
18080 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
18090 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
180a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
180b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
180c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
180d0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
180e0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
180f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18100 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
18110 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
18120 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18130 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
18140 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
18150 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
18160 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18170 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
18180 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
18190 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
181a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
181b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
181c0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
181d0 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
181e0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
181f0 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
18200 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
18210 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
18220 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
18230 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
18240 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
18250 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
18260 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
18270 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
18280 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
18290 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
182a0 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
182b0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
182c0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
182d0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
182e0 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
182f0 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
18300 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
18310 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
18320 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
18330 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
18340 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
18350 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
18360 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
18370 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
18380 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
18390 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
183a0 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
183b0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
183c0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
183d0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
183e0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
183f0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18400 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
18410 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
18420 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
18430 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
18440 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
18450 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18460 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
18470 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
18480 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
18490 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
184a0 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
184b0 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
184c0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
184d0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
184e0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
184f0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
18500 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
18510 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
18520 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
18530 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
18540 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
18550 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
18560 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
18570 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
18580 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
18590 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
185a0 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
185b0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
185c0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
185d0 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
185e0 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
185f0 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
18600 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
18610 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
18620 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
18630 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
18640 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
18650 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
18660 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
18670 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
18680 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
18690 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
186a0 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
186b0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
186c0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
186d0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
186e0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
186f0 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
18700 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
18710 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
18720 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
18730 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
18740 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
18750 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
18760 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18770 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
18780 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
18790 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
187a0 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
187b0 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
187c0 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
187d0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
187e0 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
187f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
18800 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
18810 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18820 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
18830 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
18840 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
18850 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
18860 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
18870 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
18880 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
18890 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
188a0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
188b0 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
188c0 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
188d0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
188e0 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
188f0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
18900 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
18910 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
18920 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
18930 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18940 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
18950 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
18960 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
18970 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
18980 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
18990 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
189a0 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
189b0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
189c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
189d0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
189e0 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
189f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18a00 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
18a10 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
18a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18a30 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
18a40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18a50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
18a60 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
18a70 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
18a80 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
18a90 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
18aa0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
18ab0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
18ac0 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
18ad0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
18ae0 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
18af0 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
18b00 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
18b10 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
18b20 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
18b30 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
18b40 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
18b50 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
18b60 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
18b70 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
18b80 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
18b90 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
18ba0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
18bb0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
18bc0 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
18bd0 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
18be0 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
18bf0 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
18c00 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
18c10 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
18c20 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
18c30 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
18c40 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
18c50 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
18c60 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
18c70 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
18c80 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
18c90 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
18ca0 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
18cb0 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
18cc0 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
18cd0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
18ce0 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
18cf0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
18d00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
18d10 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
18d20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
18d30 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
18d40 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
18d50 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
18d60 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
18d70 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
18d80 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
18d90 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
18da0 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
18db0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
18dc0 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
18dd0 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
18de0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
18df0 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
18e00 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
18e10 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
18e20 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18e30 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
18e40 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
18e50 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
18e60 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18e70 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
18e80 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
18e90 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
18ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18eb0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18ec0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
18ed0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
18ee0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
18ef0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
18f00 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
18f10 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
18f20 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
18f30 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
18f40 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
18f50 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
18f60 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
18f70 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
18f80 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
18f90 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
18fa0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
18fb0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
18fc0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
18fd0 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
18fe0 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
18ff0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
19000 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
19010 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
19020 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
19030 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
19040 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
19050 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
19060 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
19070 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
19080 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
19090 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
190a0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
190b0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
190c0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
190d0 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
190e0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
190f0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
19100 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
19110 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
19120 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
19130 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
19140 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
19150 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
19160 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
19170 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
19180 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
19190 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
191a0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
191b0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
191c0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
191d0 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
191e0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
191f0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
19200 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
19210 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
19220 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
19230 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
19240 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
19250 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
19260 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
19270 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
19280 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
19290 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
192a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
192b0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
192c0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
192d0 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
192e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
192f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19300 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
19310 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
19320 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
19330 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
19340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
19350 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
19360 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
19370 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
19380 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
19390 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
193a0 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt );.  if( NEVE
193b0 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  R(p->inTrans!=TR
193c0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74  ANS_WRITE || pBt
193d0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
193e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
193f0 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65  NTERNAL;.  }else
19400 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
19410 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
19420 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
19430 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70  .    /* At the p
19440 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
19450 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
19460 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
19470 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  nt with.    ** a
19480 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
19490 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
194a0 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
194b0 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20  icitly using.   
194c0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
194d0 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
194e0 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
194f0 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
19500 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73  ny.    ** such s
19510 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
19520 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
19530 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
19540 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
19550 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
19560 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
19570 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
19580 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
19590 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
195a0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
195b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
195c0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
195d0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
195e0 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
195f0 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
19600 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
19610 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
19620 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
19630 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
19640 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
19650 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
19660 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
19670 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
19680 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
19690 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
196a0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
196b0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
196c0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
196d0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
196e0 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
196f0 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
19700 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
19710 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
19720 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
19730 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
19740 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
19750 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
19760 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
19770 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
19780 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
19790 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
197a0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
197b0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
197c0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
197d0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
197e0 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
197f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
19800 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
19810 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
19820 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
19830 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19840 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
19850 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19860 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
19870 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19880 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
19890 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
198a0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
198b0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
198c0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
198d0 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
198e0 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
198f0 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
19900 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
19910 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19920 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
19930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
19940 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
19950 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
19960 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
19970 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19980 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
19990 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
199a0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
199b0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
199c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
199d0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
199e0 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
199f0 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
19a00 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
19a10 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66  ge.** iTable. If
19a20 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
19a30 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
19a40 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20  , it is assumed 
19a50 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  that.** the call
19a60 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  er already has a
19a70 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d 6f  t least a read-o
19a80 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  nly transaction 
19a90 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64  open.** on the d
19aa0 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79 2e  atabase already.
19ab0 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72 73   If a write-curs
19ac0 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  or is requested,
19ad0 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c   then.** the cal
19ae0 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20 74  ler is assumed t
19af0 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20 77  o have an open w
19b00 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
19b10 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
19b20 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
19b30 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
19b40 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
19b50 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
19b60 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
19b70 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
19b80 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
19b90 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
19ba0 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
19bb0 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
19bc0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
19bd0 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
19be0 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
19bf0 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
19c00 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
19c10 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
19c20 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
19c30 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
19c40 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
19c50 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
19c60 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
19c70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
19c80 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
19c90 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
19ca0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
19cb0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
19cc0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
19cd0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
19ce0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
19cf0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
19d00 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
19d10 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
19d20 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
19d30 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
19d40 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
19d50 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
19d60 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
19d70 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
19d80 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
19d90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
19da0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
19db0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
19dc0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
19dd0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
19de0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
19df0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
19e00 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
19e10 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
19e20 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
19e30 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
19e40 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
19e50 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
19e60 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
19e70 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
19e80 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
19e90 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
19ea0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
19eb0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
19ec0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
19ed0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
19ee0 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65 73  rsorSize() bytes
19ef0 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70   of memory .** p
19f00 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43 75  ointed to by pCu
19f10 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72 6f  r have been zero
19f20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
19f30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19f40 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
19f50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
19f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
19f80 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
19f90 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
19fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19fb0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
19fc0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
19fd0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1a000 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1a010 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a020 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a030 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a040 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
1a050 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
1a060 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
1a070 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a090 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
1a0a0 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
1a0b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a0c0 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
1a0d0 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
1a0e0 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
1a0f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
1a100 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
1a110 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
1a120 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c  rt( wrFlag==0 ||
1a130 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a 20   wrFlag==1 );.. 
1a140 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
1a150 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
1a160 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
1a170 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
1a180 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
1a190 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
1a1a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
1a1b0 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
1a1c0 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
1a1d0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
1a1e0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
1a1f0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
1a200 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
1a210 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
1a220 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
1a230 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
1a240 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1a250 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
1a260 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c 61  eyInfo!=0, wrFla
1a270 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72 74  g+1) );.  assert
1a280 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
1a290 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1a2a0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
1a2b0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
1a2c0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
1a2d0 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
1a2e0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
1a2f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
1a300 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
1a310 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
1a320 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
1a330 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1a340 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
1a350 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
1a360 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
1a370 44 61 74 61 20 29 3b 0a 0a 20 20 69 66 28 20 4e  Data );..  if( N
1a380 45 56 45 52 28 77 72 46 6c 61 67 20 26 26 20 70  EVER(wrFlag && p
1a390 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b  Bt->readOnly) ){
1a3a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a3b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
1a3c0 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31  .  if( iTable==1
1a3d0 20 26 26 20 70 61 67 65 72 50 61 67 65 63 6f 75   && pagerPagecou
1a3e0 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20  nt(pBt)==0 ){.  
1a3f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a400 45 4d 50 54 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  EMPTY;.  }..  /*
1a410 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
1a420 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
1a430 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
1a440 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
1a450 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
1a460 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20  es and link the 
1a470 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20  cursor into the 
1a480 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20  BtShared list.  
1a490 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52  */.  pCur->pgnoR
1a4a0 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62  oot = (Pgno)iTab
1a4b0 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  le;.  pCur->iPag
1a4c0 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e  e = -1;.  pCur->
1a4d0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
1a4e0 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
1a4f0 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
1a500 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
1a510 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38  ur->wrFlag = (u8
1a520 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d  )wrFlag;.  pCur-
1a530 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
1a540 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
1a550 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1a560 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1a570 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
1a580 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1a590 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
1a5a0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1a5b0 56 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63  VALID;.  pCur->c
1a5c0 61 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a  achedRowid = 0;.
1a5d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a5e0 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1a5f0 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
1a600 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a630 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
1a640 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
1a650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
1a670 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
1a680 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
1a690 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a6b0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
1a6c0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
1a6d0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a6e0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a6f0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a700 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
1a710 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
1a720 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
1a730 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
1a740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a750 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
1a760 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
1a770 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1a780 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a790 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1a7a0 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1a7b0 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1a7c0 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1a7d0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a7e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a7f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a800 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1a810 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1a820 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1a830 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1a840 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1a850 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1a860 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1a870 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1a880 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1a890 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1a8a0 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1a8b0 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1a8c0 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1a8d0 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1a8e0 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1a8f0 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1a900 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1a910 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a920 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1a930 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65  ){.  return size
1a940 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a  of(BtCursor);.}.
1a950 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1a960 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1a970 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1a980 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1a990 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1a9a0 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1a9b0 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1a9c0 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1a9d0 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1a9e0 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1a9f0 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1aa00 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1aa10 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1aa20 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1aa30 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1aa40 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1aa50 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1aa60 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1aa70 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1aa80 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1aa90 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1aaa0 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1aab0 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1aac0 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1aad0 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1aae0 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1aaf0 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1ab00 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1ab10 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1ab20 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1ab30 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1ab40 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1ab50 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1ab60 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1ab70 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1ab80 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1ab90 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1aba0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1abb0 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1abc0 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1abd0 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1abe0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1abf0 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1ac00 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1ac10 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1ac20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1ac30 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1ac40 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1ac50 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1ac60 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ac70 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1ac80 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1ac90 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1aca0 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1acb0 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1acc0 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1acd0 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1ace0 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1acf0 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1ad00 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1ad10 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1ad20 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1ad30 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1ad40 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1ad50 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1ad60 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1ad70 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1ad80 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1ad90 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1ada0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1adb0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1adc0 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1add0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1ade0 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1adf0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ae00 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1ae10 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1ae20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1ae30 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1ae40 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1ae50 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1ae60 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1ae70 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1ae80 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1ae90 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1aea0 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1aeb0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1aec0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1aed0 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1aee0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1aef0 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1af00 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1af10 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1af20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1af30 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1af40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1af50 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1af60 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1af70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1af80 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1af90 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1afa0 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1afb0 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1afc0 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1afd0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1afe0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1aff0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1b000 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1b010 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1b020 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1b030 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1b040 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1b050 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1b060 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1b070 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1b080 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1b090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b0a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b0b0 53 54 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  ST./*.** Make a 
1b0c0 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
1b0d0 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74   by filling in t
1b0e0 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65  he fields of pTe
1b0f0 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65  mpCur..** The te
1b100 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69  mporary cursor i
1b110 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
1b120 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65  sor list for the
1b130 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20   Btree..*/.void 
1b140 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
1b150 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
1b160 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
1b170 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
1b180 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1b190 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b1a0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65  ex(pCur) );.  me
1b1b0 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70  mcpy(pTempCur, p
1b1c0 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75  Cur, sizeof(BtCu
1b1d0 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  rsor));.  pTempC
1b1e0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
1b1f0 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
1b200 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
1b210 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50   i<=pTempCur->iP
1b220 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
1b230 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
1b240 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  TempCur->apPage[
1b250 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
1b260 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d  }.  assert( pTem
1b270 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b  pCur->pKey==0 );
1b280 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1b290 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66  ITE_TEST */..#if
1b2a0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b2b0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
1b2c0 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
1b2d0 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
1b2e0 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
1b2f0 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
1b300 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
1b310 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1b320 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
1b330 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
1b340 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
1b350 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
1b360 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b370 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ur) );.  for(i=0
1b380 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1b390 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1b3a0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
1b3b0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
1b3c0 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73  DbPage);.  }.  s
1b3d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1b3e0 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64 69  ->pKey);.}.#endi
1b3f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
1b400 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20   */../*.** Make 
1b410 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1b420 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1b430 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1b440 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1b450 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1b460 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1b470 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1b480 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  ll.** sqlite3Btr
1b490 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1b4a0 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1b4b0 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1b4c0 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1b4d0 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1b4e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1b4f0 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1b500 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1b510 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1b520 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
1b530 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1b540 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1b550 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1b560 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1b570 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1b580 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1b590 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1b5a0 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1b5b0 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1b5c0 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1b5d0 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1b5e0 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1b5f0 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1b600 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1b610 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1b620 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1b630 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1b640 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1b650 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1b660 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1b670 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1b680 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1b690 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1b6a0 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1b6b0 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1b6c0 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1b6d0 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1b6e0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1b6f0 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1b700 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1b710 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1b720 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1b730 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1b740 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1b750 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1b760 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1b770 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
1b780 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1b790 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1b7a0 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1b7b0 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1b7c0 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1b7d0 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1b7e0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1b7f0 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1b800 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1b810 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1b820 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1b830 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1b840 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1b850 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1b860 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1b870 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1b880 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1b890 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1b8a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1b8b0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1b8c0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1b8d0 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1b8e0 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1b8f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1b900 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1b910 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1b920 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1b930 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1b940 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1b950 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1b960 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1b970 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1b980 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1b990 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1b9a0 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1b9b0 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1b9c0 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1b9d0 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1b9e0 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1b9f0 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1ba00 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1ba40 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1ba50 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 5c 0a                \.
1ba90 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1baa0 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1bab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1bae0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1baf0 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1bb00 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1bb10 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1bb20 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1bb30 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1bb40 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
1bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb80 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1bb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbd0 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1bbe0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1bc30 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1bc40 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1bc50 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1bc60 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
1bc70 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
1bc80 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
1bc90 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
1bca0 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
1bcb0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1bcc0 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
1bcd0 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
1bce0 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
1bcf0 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
1bd00 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
1bd10 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
1bd20 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1bd30 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
1bd40 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
1bd50 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1bd60 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
1bd70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1bd80 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1bd90 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1bda0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1bdb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1bdc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1bdd0 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1bde0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1bdf0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1be00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1be10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1be20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1be30 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1be40 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1be50 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
1be60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1be70 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1be80 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
1be90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bea0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1beb0 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
1bec0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1bed0 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
1bee0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bef0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1bf00 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1bf10 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1bf20 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1bf30 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1bf40 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
1bf50 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
1bf60 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
1bf70 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1bf80 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
1bf90 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1bfa0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
1bfb0 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
1bfc0 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
1bfd0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
1bfe0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1bff0 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
1c000 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1c010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1c020 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1c030 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1c040 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
1c050 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1c060 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1c070 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1c080 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1c090 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1c0a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c0b0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1c0c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c0d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1c0e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c0f0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1c100 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1c110 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1c120 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
1c130 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
1c140 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
1c150 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
1c160 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
1c170 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1c180 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1c190 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1c1a0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1c1b0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
1c1c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1c1d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1c1e0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1c1f0 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
1c200 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1c210 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
1c220 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
1c230 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
1c240 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1c250 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1c260 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
1c270 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
1c280 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
1c290 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
1c2a0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
1c2b0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
1c2c0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
1c2d0 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
1c2e0 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
1c2f0 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
1c300 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1c310 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
1c320 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1c330 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
1c340 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
1c350 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1c360 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1c370 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
1c380 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
1c390 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
1c3a0 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
1c3b0 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1c3c0 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
1c3d0 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
1c3e0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1c3f0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
1c400 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
1c410 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
1c420 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
1c430 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
1c440 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
1c450 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
1c460 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
1c470 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1c480 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
1c490 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
1c4a0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1c4b0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1c4c0 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
1c4d0 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
1c4e0 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
1c4f0 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
1c500 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
1c510 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
1c520 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
1c530 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
1c540 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
1c550 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
1c560 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
1c570 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
1c580 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1c590 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
1c5a0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1c5b0 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
1c5c0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
1c5d0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1c5e0 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
1c5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1c600 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  rent overflow pa
1c610 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d  ge number */.  M
1c620 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1c630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1c640 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
1c650 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29  le (may be NULL)
1c660 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e   */.  Pgno *pPgn
1c670 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20  oNext           
1c680 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20     /* OUT: Next 
1c690 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75  overflow page nu
1c6a0 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e  mber */.){.  Pgn
1c6b0 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65  o next = 0;.  Me
1c6c0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1c6d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1c6e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
1c6f0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1c700 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1c710 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50  ) );.  assert(pP
1c720 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64  gnoNext);..#ifnd
1c730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1c740 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54  UTOVACUUM.  /* T
1c750 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e  ry to find the n
1c760 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ext page in the 
1c770 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73  overflow list us
1c780 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74  ing the.  ** aut
1c790 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d  ovacuum pointer-
1c7a0 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73  map pages. Guess
1c7b0 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70   that the next p
1c7c0 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65  age in .  ** the
1c7d0 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69   overflow list i
1c7e0 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  s page number (o
1c7f0 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20  vfl+1). If that 
1c800 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a  guess turns .  *
1c810 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e  * out to be wron
1c820 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  g, fall back to 
1c830 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  loading the data
1c840 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e   of page .  ** n
1c850 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65  umber ovfl to de
1c860 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74  termine the next
1c870 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20   page number..  
1c880 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  */.  if( pBt->au
1c890 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1c8a0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50  Pgno pgno;.    P
1c8b0 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66  gno iGuess = ovf
1c8c0 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70  l+1;.    u8 eTyp
1c8d0 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50  e;..    while( P
1c8e0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1c8f0 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75  , iGuess) || iGu
1c900 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  ess==PENDING_BYT
1c910 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1c920 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20       iGuess++;. 
1c930 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47     }..    if( iG
1c940 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63  uess<=pagerPagec
1c950 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
1c960 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1c970 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26  t(pBt, iGuess, &
1c980 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20  eType, &pgno);. 
1c990 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1c9a0 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d  ITE_OK && eType=
1c9b0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1c9c0 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
1c9d0 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
1c9e0 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
1c9f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1ca00 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
1ca10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1ca20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ca30 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1ca40 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1ca50 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
1ca60 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  age, 0);.    ass
1ca70 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1ca80 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a  K || pPage==0);.
1ca90 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20      if( next==0 
1caa0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1cab0 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
1cac0 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
1cad0 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
1cae0 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
1caf0 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
1cb00 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
1cb10 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
1cb20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
1cb30 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
1cb40 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
1cb50 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
1cb60 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
1cb70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
1cb80 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1cb90 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
1cba0 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
1cbb0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
1cbc0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
1cbd0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
1cbe0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
1cbf0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
1cc00 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
1cc10 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
1cc20 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
1cc30 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
1cc40 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
1cc50 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
1cc60 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
1cc70 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
1cc80 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
1cc90 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
1cca0 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
1ccb0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
1ccc0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
1ccd0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
1cce0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
1ccf0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
1cd00 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1cd10 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
1cd20 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
1cd30 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
1cd40 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
1cd50 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
1cd60 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
1cd70 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1cd80 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
1cd90 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
1cda0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
1cdb0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
1cdc0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cde0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1cdf0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
1ce00 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
1ce10 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
1ce20 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
1ce30 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
1ce40 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
1ce50 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
1ce60 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
1ce70 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
1ce80 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
1ce90 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1cea0 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
1ceb0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
1cec0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
1ced0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
1cee0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
1cef0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1cf00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cf20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
1cf30 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
1cf40 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
1cf50 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1cf60 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
1cf70 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
1cf80 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
1cf90 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
1cfa0 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
1cfb0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1cfc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1cfd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cfe0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
1cff0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
1d000 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
1d010 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
1d020 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
1d030 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
1d040 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
1d050 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
1d060 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
1d070 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
1d080 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
1d090 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
1d0a0 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
1d0b0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
1d0c0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
1d0d0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
1d0e0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
1d0f0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
1d100 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
1d110 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
1d120 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
1d130 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
1d140 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
1d150 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1d160 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
1d170 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
1d180 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
1d190 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
1d1a0 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
1d1b0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
1d1c0 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
1d1d0 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
1d1e0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
1d1f0 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
1d200 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
1d210 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
1d220 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
1d230 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
1d240 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1d250 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
1d260 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d270 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
1d280 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
1d290 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
1d2a0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
1d2b0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
1d2c0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
1d2d0 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
1d2e0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
1d2f0 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
1d300 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1d310 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
1d320 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
1d330 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
1d340 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
1d350 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
1d360 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
1d370 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
1d380 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1d390 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1d3a0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
1d3b0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
1d3c0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
1d3d0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
1d3e0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
1d3f0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
1d400 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
1d410 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
1d420 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
1d430 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
1d440 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
1d450 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
1d460 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
1d470 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1d480 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
1d490 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
1d4a0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
1d4b0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
1d4c0 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
1d4d0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
1d4e0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
1d4f0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
1d500 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
1d510 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
1d520 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
1d530 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
1d540 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
1d550 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
1d560 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
1d570 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
1d580 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
1d590 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
1d5a0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
1d5b0 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
1d5c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1d5d0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
1d5e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
1d5f0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
1d600 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
1d610 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
1d620 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
1d630 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
1d640 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
1d650 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
1d660 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1d670 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
1d680 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
1d690 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
1d6a0 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
1d6b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
1d6c0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
1d6d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
1d6e0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
1d6f0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
1d700 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
1d710 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1d720 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
1d730 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
1d740 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
1d750 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1d760 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
1d770 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1d780 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
1d790 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73  ngs to */..  ass
1d7a0 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
1d7b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1d7c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1d7d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1d7e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1d7f0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1d800 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
1d810 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d820 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20  tex(pCur) );..  
1d830 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
1d840 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
1d850 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
1d860 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48   + pCur->info.nH
1d870 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20  eader;.  nKey = 
1d880 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f  (pPage->intKey ?
1d890 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e   0 : (int)pCur->
1d8a0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69  info.nKey);..  i
1d8b0 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1d8c0 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79    offset += nKey
1d8d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73  ;.  }.  if( offs
1d8e0 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43  et+amt > nKey+pC
1d8f0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a  ur->info.nData .
1d900 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b     || &aPayload[
1d910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1d920 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
1d930 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
1d940 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20  ze].  ){.    /* 
1d950 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
1d960 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
1d970 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
1d980 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
1d990 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d9a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1d9b0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
1d9c0 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
1d9d0 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
1d9e0 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
1d9f0 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
1da00 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
1da10 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
1da20 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
1da30 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
1da40 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
1da50 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
1da60 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1da70 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
1da80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
1da90 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
1daa0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
1dab0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
1dac0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
1dad0 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
1dae0 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
1daf0 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
1db00 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
1db10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1db20 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1db30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1db40 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
1db50 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
1db60 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1db70 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
1db80 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
1db90 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
1dba0 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
1dbb0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
1dbc0 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
1dbd0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
1dbe0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
1dbf0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1dc00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
1dc10 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1dc20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20  flag is set and 
1dc30 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
1dc40 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20  erflow[].    ** 
1dc50 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
1dc60 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65  ocated, allocate
1dc70 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72   it now. The arr
1dc80 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20  ay is sized at. 
1dc90 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20     ** one entry 
1dca0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
1dcb0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  w page in the ov
1dcc0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
1dcd0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75  e.    ** page nu
1dce0 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
1dcf0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
1dd00 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  is stored in aOv
1dd10 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a  erflow[0],.    *
1dd20 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  * etc. A value o
1dd30 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
1dd40 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61  flow[] array mea
1dd50 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
1dd60 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63  n".    ** (the c
1dd70 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
1dd80 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
1dd90 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
1dda0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1ddb0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
1ddc0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e  flow ){.      in
1ddd0 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d  t nOvfl = (pCur-
1dde0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70  >info.nPayload-p
1ddf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1de00 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66  +ovflSize-1)/ovf
1de10 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75  lSize;.      pCu
1de20 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28  r->aOverflow = (
1de30 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61  Pgno *)sqlite3Ma
1de40 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
1de50 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20  Pgno)*nOvfl);.  
1de60 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26      if( nOvfl &&
1de70 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f   !pCur->aOverflo
1de80 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  w ){.        rc 
1de90 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
1dea0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1deb0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65     /* If the ove
1dec0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1ded0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
1dee0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
1def0 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f  .    ** entry fo
1df00 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  r the first requ
1df10 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  ired overflow pa
1df20 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69  ge is valid, ski
1df30 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  p.    ** directl
1df40 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  y to it..    */.
1df50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1df60 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1df70 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
1df80 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
1df90 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66       iIdx = (off
1dfa0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set/ovflSize);. 
1dfb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1dfc0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1dfd0 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66  iIdx];.      off
1dfe0 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
1dff0 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  flSize);.    }.#
1e000 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20  endif..    for( 
1e010 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
1e020 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74  && amt>0 && next
1e030 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a  Page; iIdx++){..
1e040 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e050 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1e060 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
1e070 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
1e080 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
1e090 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
1e0a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1e0b0 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
1e0c0 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e    assert(!pCur->
1e0d0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
1e0e0 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
1e0f0 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
1e100 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  ge);.        pCu
1e110 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1e120 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
1e130 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20       }.#endif.. 
1e140 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
1e150 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
1e160 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
1e170 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
1e180 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
1e190 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
1e1a0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1e1b0 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
1e1c0 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
1e1d0 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
1e1e0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
1e1f0 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
1e200 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
1e210 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
1e220 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
1e230 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
1e240 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
1e250 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
1e260 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
1e270 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
1e280 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
1e290 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1e2a0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1e2b0 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  B.        if( pC
1e2c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
1e2d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e2e0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
1e2f0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1e300 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1e310 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
1e320 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66    } else .#endif
1e330 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e340 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
1e350 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30  pBt, nextPage, 0
1e360 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20  , &nextPage);.  
1e370 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
1e380 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
1e390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1e3a0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
1e3b0 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
1e3c0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
1e3d0 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
1e3e0 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
1e3f0 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
1e400 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
1e410 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
1e420 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
1e430 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
1e440 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
1e450 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1e460 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e470 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
1e480 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
1e490 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20  , &pDbPage);.   
1e4a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e4c0 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
1e4d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
1e4e0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
1e4f0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1e500 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c  = get4byte(aPayl
1e510 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oad);.          
1e520 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
1e530 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
1e540 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66           a = ovf
1e550 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  lSize - offset;.
1e560 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e570 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
1e580 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
1e590 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
1e5a0 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67  , a, eOp, pDbPag
1e5b0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
1e5c0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1e5d0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e5e0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
1e5f0 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d            amt -=
1e600 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42   a;.          pB
1e610 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20  uf += a;.       
1e620 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e630 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1e640 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1e650 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
1e660 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e670 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
1e680 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e690 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
1e6a0 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
1e6b0 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
1e6c0 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
1e6d0 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
1e6e0 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
1e6f0 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
1e700 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
1e710 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
1e720 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
1e730 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1e740 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
1e750 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
1e760 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
1e770 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1e780 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
1e790 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
1e7a0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
1e7b0 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
1e7c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  nt sqlite3BtreeK
1e7d0 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ey(BtCursor *pCu
1e7e0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
1e7f0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
1e800 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
1e810 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e820 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e830 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1e840 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1e850 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1e860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e870 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e880 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e890 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1e8a0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1e8b0 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1e8c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e8d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1e8e0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
1e8f0 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
1e900 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e910 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1e920 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e930 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1e940 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
1e950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
1e960 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  Cell );.    rc =
1e970 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
1e980 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
1e990 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
1e9a0 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20  *)pBuf, 0, 0);. 
1e9b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1e9c0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61  }../*.** Read pa
1e9d0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
1e9e0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1e9f0 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1ea00 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1ea10 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1ea20 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1ea30 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1ea40 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1ea50 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1ea60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ea70 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1ea80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1ea90 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1eaa0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1eab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1eac0 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1ead0 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1eae0 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1eaf0 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1eb00 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74  ite3BtreeData(Bt
1eb10 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1eb20 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
1eb30 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
1eb40 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64    int rc;..#ifnd
1eb50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
1eb60 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70  NCRBLOB.  if ( p
1eb70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1eb80 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
1eb90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1eba0 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64  _ABORT;.  }.#end
1ebb0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  if..  assert( cu
1ebc0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ebd0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1ebe0 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1ebf0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1ec00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ec10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ec20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1ec30 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1ec40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1ec50 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
1ec60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ec70 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
1ec80 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1ec90 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1eca0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1ecb0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1ecc0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
1ecd0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
1ece0 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
1ecf0 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   1, 0);.  }.  re
1ed00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1ed10 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1ed20 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
1ed30 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
1ed40 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1ed50 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
1ed60 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
1ed70 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
1ed80 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
1ed90 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
1eda0 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61   if skipKey==0 a
1edb0 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  nd it points to 
1edc0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
1edd0 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70   data if.** skip
1ede0 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d  Key==1.  The num
1edf0 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
1ee00 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61  available key/da
1ee10 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  ta is written.**
1ee20 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
1ee30 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
1ee40 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
1ee50 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a  ed will not be.*
1ee60 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  * a valid pointe
1ee70 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
1ee80 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
1ee90 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
1eea0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
1eeb0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
1eec0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
1eed0 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
1eee0 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
1eef0 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
1ef00 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
1ef10 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
1ef20 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
1ef30 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
1ef40 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
1ef50 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
1ef60 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
1ef70 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
1ef80 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
1ef90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
1efa0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
1efb0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
1efc0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
1efd0 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
1efe0 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
1eff0 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
1f000 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
1f010 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
1f020 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
1f030 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
1f040 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
1f050 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
1f060 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
1f070 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
1f080 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
1f090 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
1f0a0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
1f0b0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1f0c0 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
1f0d0 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79  d char *fetchPay
1f0e0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
1f0f0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
1f100 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
1f110 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
1f120 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1f130 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  pAmt,           
1f140 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  /* Write the num
1f150 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1f160 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20   bytes here */. 
1f170 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20   int skipKey    
1f180 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65        /* read be
1f190 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20  ginning at data 
1f1a0 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
1f1b0 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1f1c0 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1f1d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1f1e0 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20  e;.  u32 nKey;. 
1f1f0 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20   u32 nLocal;..  
1f200 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
1f210 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  && pCur->iPage>=
1f220 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1f230 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1f240 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f250 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1f260 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1f270 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f280 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
1f290 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1f2a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f2c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1f2d0 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1f2e0 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  l );.  getCellIn
1f2f0 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
1f300 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
1f310 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c  o.pCell;.  aPayl
1f320 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66  oad += pCur->inf
1f330 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28  o.nHeader;.  if(
1f340 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1f350 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a  {.    nKey = 0;.
1f360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65    }else{.    nKe
1f370 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  y = (int)pCur->i
1f380 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
1f390 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
1f3a0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
1f3b0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
1f3c0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1f3d0 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
1f3e0 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
1f3f0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
1f400 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
1f410 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
1f420 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
1f430 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
1f440 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
1f450 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
1f460 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
1f470 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
1f480 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
1f490 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
1f4a0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
1f4b0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
1f4c0 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
1f4d0 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
1f4e0 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
1f4f0 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
1f500 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
1f510 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
1f520 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
1f530 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
1f540 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
1f550 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
1f560 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
1f570 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
1f580 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
1f590 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
1f5a0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
1f5b0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
1f5c0 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
1f5d0 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
1f5e0 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
1f5f0 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
1f600 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
1f610 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
1f620 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1f630 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
1f640 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
1f650 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
1f660 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
1f670 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1f680 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
1f690 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
1f6a0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
1f6b0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
1f6c0 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
1f6d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1f6e0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1f6f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1f700 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1f710 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
1f720 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1f730 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1f740 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1f750 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f760 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1f770 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1f780 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1f790 70 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pAmt, 0);.  }.  
1f7a0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73  return 0;.}.cons
1f7b0 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
1f7c0 74 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74  treeDataFetch(Bt
1f7d0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1f7e0 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65  t *pAmt){.  asse
1f7f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1f800 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1f810 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1f820 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1f830 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f840 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1f850 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1f860 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1f870 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1f880 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1f890 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a  pCur, pAmt, 1);.
1f8a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f8b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1f8c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1f8d0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
1f8e0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
1f8f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1f900 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
1f910 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
1f920 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f  e to move to..*/
1f930 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1f940 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
1f950 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
1f960 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gno){.  int rc;.
1f970 20 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e    int i = pCur->
1f980 69 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  iPage;.  MemPage
1f990 20 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74   *pNewPage;.  Bt
1f9a0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
1f9b0 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
1f9c0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f9d0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f9e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f9f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1fa00 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1fa10 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
1fa20 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
1fa30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
1fa40 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
1fa50 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
1fa60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1fa70 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fa80 20 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64   }.  rc = getAnd
1fa90 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65  InitPage(pBt, ne
1faa0 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65  wPgno, &pNewPage
1fab0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1fac0 74 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d  turn rc;.  pCur-
1fad0 3e 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70  >apPage[i+1] = p
1fae0 4e 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  NewPage;.  pCur-
1faf0 3e 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b  >aiIdx[i+1] = 0;
1fb00 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
1fb10 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ;..  pCur->info.
1fb20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1fb30 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1fb40 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65  ;.  if( pNewPage
1fb50 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20  ->nCell<1 ){.   
1fb60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1fb70 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1fb80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fb90 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  _OK;.}..#ifndef 
1fba0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67  NDEBUG./*.** Pag
1fbb0 65 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20  e pParent is an 
1fbc0 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65  internal (non-le
1fbd0 61 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54  af) tree page. T
1fbe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
1fbf0 20 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61   asserts that pa
1fc00 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
1fc10 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69   is the left-chi
1fc20 6c 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74  ld if the iIdx't
1fc30 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67  h.** cell in pag
1fc40 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69  e pParent. Or, i
1fc50 66 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20  f iIdx is equal 
1fc60 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  to the total num
1fc70 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20  ber of.** cells 
1fc80 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74  in pParent, that
1fc90 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
1fca0 69 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74  ild is the right
1fcb0 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65  -child of.** the
1fcc0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1fcd0 20 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65   void assertPare
1fce0 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20  ntIndex(MemPage 
1fcf0 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49  *pParent, int iI
1fd00 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29  dx, Pgno iChild)
1fd10 7b 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78  {.  assert( iIdx
1fd20 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  <=pParent->nCell
1fd30 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d   );.  if( iIdx==
1fd40 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
1fd50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1fd60 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
1fd70 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
1fd80 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69  hdrOffset+8])==i
1fd90 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65  Child );.  }else
1fda0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65  {.    assert( ge
1fdb0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1fdc0 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d  pParent, iIdx))=
1fdd0 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d  =iChild );.  }.}
1fde0 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65  .#else.#  define
1fdf0 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64   assertParentInd
1fe00 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69  ex(x,y,z) .#endi
1fe10 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
1fe20 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
1fe30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
1fe40 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
1fe50 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
1fe60 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
1fe70 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
1fe80 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
1fe90 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
1fea0 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
1feb0 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
1fec0 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
1fed0 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
1fee0 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
1fef0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
1ff00 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
1ff10 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  cell index..*/.v
1ff20 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1ff30 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  MoveToParent(BtC
1ff40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ff50 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1ff60 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1ff70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1ff80 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ff90 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1ffa0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1ffb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( 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 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
1ffe0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
1fff0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
20000 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
20010 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
20020 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
20030 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
20040 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20050 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72  ]->pgno.  );.  r
20060 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
20070 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20080 61 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69  age]);.  pCur->i
20090 50 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e  Page--;.  pCur->
200a0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
200b0 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
200c0 79 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  y = 0;.}../*.** 
200d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
200e0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
200f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
20100 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
20110 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
20120 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
20130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20140 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
20150 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
20160 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
20170 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
20180 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
20190 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
201a0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
201b0 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
201c0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
201d0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
201e0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
201f0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
20200 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
20210 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
20220 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
20230 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
20240 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
20250 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
20260 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20270 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
20280 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
20290 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
202a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
202b0 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29  learCursor(pCur)
202c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75  ;.  }..  if( pCu
202d0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20  r->iPage>=0 ){. 
202e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
202f0 72 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=1; i<=pCur->
20300 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
20310 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
20320 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
20330 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
20340 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65  >iPage = 0;.  }e
20350 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20  lse{.    if( .  
20360 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
20370 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
20380 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
20390 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
203a0 61 70 50 61 67 65 5b 30 5d 29 29 0a 20 20 20 20  apPage[0])).    
203b0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
203c0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
203d0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
203e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
203f0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
20400 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   0;..    /* If p
20410 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
20420 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
20430 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
20440 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
20450 6f 72 0a 20 20 20 20 2a 2a 20 65 78 70 65 63 74  or.    ** expect
20460 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e  ed to open it on
20470 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
20480 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
20490 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 20 20  pKeyInfo is.    
204a0 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c  ** NULL, the cal
204b0 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61  ler expects a ta
204c0 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74  ble b-tree. If t
204d0 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
204e0 61 73 65 2c 0a 20 20 20 20 2a 2a 20 72 65 74 75  ase,.    ** retu
204f0 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
20500 52 55 50 54 20 65 72 72 6f 72 2e 20 20 2a 2f 0a  RUPT error.  */.
20510 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
20520 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
20530 4b 65 79 3d 3d 31 20 7c 7c 20 70 43 75 72 2d 3e  Key==1 || pCur->
20540 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
20550 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  y==0 );.    if( 
20560 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
20570 3d 30 29 21 3d 70 43 75 72 2d 3e 61 70 50 61 67  =0)!=pCur->apPag
20580 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  e[0]->intKey ){.
20590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
205a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
205b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
205c0 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
205d0 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
205e0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
205f0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
20600 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30  .  pCur->aiIdx[0
20610 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  ] = 0;.  pCur->i
20620 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
20630 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
20640 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
20650 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28  NKey = 0;..  if(
20660 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30   pRoot->nCell==0
20670 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66   && !pRoot->leaf
20680 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62   ){.    Pgno sub
20690 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52  page;.    if( pR
206a0 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72  oot->pgno!=1 ) r
206b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
206c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61  RUPT_BKPT;.    a
206d0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
206e0 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62  no==1 );.    sub
206f0 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  page = get4byte(
20700 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52  &pRoot->aData[pR
20710 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  oot->hdrOffset+8
20720 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
20730 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20  subpage>0 );.   
20740 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
20750 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
20760 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
20770 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65  ld(pCur, subpage
20780 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20790 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28  pCur->eState = (
207a0 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29  (pRoot->nCell>0)
207b0 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
207c0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
207d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
207e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
207f0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
20800 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
20810 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
20820 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
20830 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
20840 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
20850 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
20860 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
20870 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
20880 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
20890 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
208a0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
208b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
208c0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
208d0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
208e0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
208f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20900 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
20910 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
20920 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20930 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20940 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20950 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20960 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
20970 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
20980 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
20990 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
209a0 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eaf ){.    asser
209b0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
209c0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67  Cur->iPage]<pPag
209d0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
209e0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
209f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
20a00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
20a10 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20  ->iPage]));.    
20a20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20a30 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
20a40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20a50 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
20a60 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
20a70 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
20a80 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
20a90 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
20aa0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
20ab0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
20ac0 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
20ad0 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
20ae0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
20af0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
20b00 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
20b10 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
20b20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
20b30 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
20b40 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
20b50 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
20b60 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
20b70 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
20b80 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
20b90 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
20ba0 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
20bb0 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
20bc0 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
20bd0 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
20be0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
20bf0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
20c00 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
20c10 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
20c20 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
20c30 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
20c40 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
20c50 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
20c60 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
20c70 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20c80 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20c90 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20ca0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
20cb0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
20cc0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
20cd0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20ce0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
20cf0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
20d00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
20d10 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
20d20 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
20d30 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
20d40 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
20d50 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
20d60 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
20d70 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
20d80 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
20d90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43  ITE_OK ){.    pC
20da0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
20db0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
20dc0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75  nCell-1;.    pCu
20dd0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20de0 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
20df0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
20e00 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20e10 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
20e20 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
20e30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
20e40 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
20e50 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
20e60 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
20e70 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
20e80 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
20e90 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
20ea0 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
20eb0 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
20ec0 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
20ed0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
20ee0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
20ef0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
20f00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
20f10 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
20f20 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
20f30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20f40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
20f50 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
20f60 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
20f70 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
20f80 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
20f90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
20fa0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20fb0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
20fc0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
20fd0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20fe0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
20ff0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
21000 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  s = 1;.      rc 
21010 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
21020 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
21030 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21040 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
21050 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20  >nCell>0 );.    
21060 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
21070 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
21080 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
21090 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
210a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
210b0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
210c0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
210d0 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
210e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
210f0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
21100 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
21110 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
21120 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
21130 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
21140 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
21150 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
21160 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21170 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72  3BtreeLast(BtCur
21180 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
21190 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
211a0 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  . .  assert( cur
211b0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
211c0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
211d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
211e0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
211f0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
21200 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
21210 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  sor already poin
21220 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ts to the last e
21230 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20  ntry, this is a 
21240 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20  no-op. */.  if( 
21250 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
21260 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43  ur->eState && pC
21270 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69  ur->atLast ){.#i
21280 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21290 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
212a0 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
212b0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
212c0 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
212d0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
212e0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
212f0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
21300 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
21310 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
21320 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
21330 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
21340 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
21350 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
21360 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
21370 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
21380 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
21390 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
213a0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
213b0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
213c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
213d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
213e0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
213f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
21400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21410 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
21420 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
21430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21440 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
21450 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
21460 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
21470 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21480 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21490 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  e]->nCell==0 );.
214a0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
214b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
214c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
214d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
214e0 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
214f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
21500 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
21510 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
21520 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
21530 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31  rc==SQLITE_OK ?1
21540 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  :0;.    }.  }.  
21550 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21560 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
21570 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
21580 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
21590 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
215a0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
215b0 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
215c0 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
215d0 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
215e0 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
215f0 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
21600 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
21610 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
21620 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
21630 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
21640 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
21650 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
21660 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
21670 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
21680 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
21690 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
216a0 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
216b0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
216c0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
216d0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
216e0 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
216f0 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
21700 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
21710 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
21720 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
21730 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
21740 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
21750 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
21760 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
21770 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
21780 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
21790 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
217a0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
217b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
217c0 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
217d0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
217e0 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
217f0 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
21800 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
21810 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
21820 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
21830 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21840 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
21850 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21860 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
21870 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
21880 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
21890 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
218c0 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
218d0 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
218e0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
218f0 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
21900 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
21910 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
21920 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
21930 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
21940 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
21950 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
21960 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
21970 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
21980 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
21990 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
219a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
219b0 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
219c0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
219d0 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c  y..**.*/.int sql
219e0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
219f0 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
21a00 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
21a10 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
21a20 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
21a30 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
21a40 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
21a50 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
21a60 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
21a70 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
21a80 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
21a90 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
21aa0 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
21ab0 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
21ac0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
21ad0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
21ae0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
21af0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
21b00 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
21b10 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
21b20 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
21b30 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
21b40 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
21b50 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21b60 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
21b70 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
21b80 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
21b90 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
21ba0 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
21bb0 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
21bc0 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
21bd0 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
21be0 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
21bf0 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
21c00 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
21c10 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21c20 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76  VALID && pCur->v
21c30 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20  alidNKey .   && 
21c40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
21c50 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20  >intKey .  ){.  
21c60 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
21c70 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
21c80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
21c90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21ca0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
21cb0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74      if( pCur->at
21cc0 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e  Last && pCur->in
21cd0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
21ce0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
21cf0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
21d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
21d10 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  }.  }..  rc = mo
21d20 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
21d30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21d50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
21d60 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
21d70 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
21d80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
21d90 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
21da0 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  t );.  if( pCur-
21db0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
21dc0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
21dd0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
21de0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
21df0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
21e00 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
21e10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21e20 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
21e30 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  ( pCur->apPage[0
21e40 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64  ]->intKey || pId
21e50 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b  xKey );.  for(;;
21e60 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20  ){.    int lwr, 
21e70 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  upr;.    Pgno ch
21e80 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
21e90 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
21ea0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21eb0 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20  age];.    int c 
21ec0 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
21ed0 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
21ee0 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
21ef0 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
21f00 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
21f10 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
21f20 20 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e   if( (!pPage->in
21f30 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d  tKey && pIdxKey=
21f40 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a  =0) || upr<0 ){.
21f50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21f60 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
21f70 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
21f80 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
21f90 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
21fa0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
21fb0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
21fc0 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a  ge] = (u16)upr;.
21fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21fe0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
21ff0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22000 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a  )((upr+lwr)/2);.
22010 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b      }.    for(;;
22020 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78  ){.      int idx
22030 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
22040 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20  Cur->iPage]; /* 
22050 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
22060 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
22070 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  /.      u8 *pCel
22080 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
22090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
220a0 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
220b0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
220c0 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  */..      pCur->
220d0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
220e0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69        pCell = fi
220f0 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
22100 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  x) + pPage->chil
22110 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
22120 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
22130 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  y ){.        i64
22140 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
22150 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
22160 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
22170 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
22180 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
22190 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
221a0 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
221b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
221c0 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
221d0 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
221e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
221f0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
22200 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
22210 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
22220 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
22230 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
22240 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
22250 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22260 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
22270 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
22280 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
22290 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
222a0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
222b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43   = 1;.        pC
222c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20  ur->info.nKey = 
222d0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
222e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
222f0 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75  * The maximum su
22300 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a  pported page-siz
22310 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73  e is 32768 bytes
22320 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
22330 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  t.        ** the
22340 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
22350 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20  of record bytes 
22360 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64  stored on an ind
22370 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20  ex B-Tree.      
22380 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20    ** page is at 
22390 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c  most 8198 bytes,
223a0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74   which may be st
223b0 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65  ored as a 2-byte
223c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69  .        ** vari
223d0 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  nt. This informa
223e0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
223f0 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64  attempt to avoid
22400 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20   parsing .      
22410 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20    ** the entire 
22420 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67  cell by checking
22430 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77   for the cases w
22440 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20  here the record 
22450 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  is .        ** s
22460 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77  tored entirely w
22470 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ithin the b-tree
22480 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74   page by inspect
22490 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20  ing the first . 
224a0 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65         ** 2 byte
224b0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20  s of the cell.. 
224c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
224d0 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43    int nCell = pC
224e0 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ell[0];.        
224f0 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78  if( !(nCell & 0x
22500 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50  80) && nCell<=pP
22510 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
22520 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
22530 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69  is branch runs i
22540 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a  f the record-siz
22550 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  e field of the c
22560 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20  ell is a.       
22570 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
22580 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65  e varint and the
22590 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74   record fits ent
225a0 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69  irely on the mai
225b0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  n.          ** b
225c0 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
225d0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71            c = sq
225e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
225f0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
22600 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20  oid*)&pCell[1], 
22610 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
22620 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43    }else if( !(pC
22630 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a  ell[1] & 0x80) .
22640 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43            && (nC
22650 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78  ell = ((nCell&0x
22660 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b  7f)<<7) + pCell[
22670 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  1])<=pPage->maxL
22680 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a  ocal.        ){.
22690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
226a0 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
226b0 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76  ld is a 2 byte v
226c0 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65  arint and the re
226d0 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20  cord .          
226e0 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  ** fits entirely
226f0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74   on the main b-t
22700 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20  ree page.  */.  
22710 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
22720 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
22730 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
22740 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
22750 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
22760 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
22770 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
22780 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
22790 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
227a0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
227b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
227c0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
227d0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
227e0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
227f0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
22800 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
22810 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
22820 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
22830 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
22840 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
22850 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
22860 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
22870 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a  can be called. *
22880 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64  /.          void
22890 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
228a0 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74        u8 * const
228b0 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65   pCellBody = pCe
228c0 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll - pPage->chil
228d0 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20  dPtrSize;.      
228e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
228f0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
22900 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
22910 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
22920 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
22930 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
22940 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Key;.          p
22950 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
22960 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29  3Malloc( nCell )
22970 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
22980 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
22990 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
229a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
229b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
229c0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
229d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
229e0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
229f0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
22a00 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
22a10 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
22a20 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
22a30 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
22a40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
22a50 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20  Cell, pCellKey, 
22a60 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
22a70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22a80 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
22a90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
22aa0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
22ab0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
22ac0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
22ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
22ae0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
22af0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
22b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
22b10 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
22b20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
22b30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
22b40 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
22b50 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  {.          *pRe
22b60 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
22b70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22b80 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22b90 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
22ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
22bb0 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29  .      if( c<0 )
22bc0 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20  {.        lwr = 
22bd0 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c  idx+1;.      }el
22be0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20  se{.        upr 
22bf0 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d  = idx-1;.      }
22c00 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75  .      if( lwr>u
22c10 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  pr ){.        br
22c20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
22c30 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
22c40 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
22c50 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29  16)((lwr+upr)/2)
22c60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22c70 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29  rt( lwr==upr+1 )
22c80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
22c90 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
22ca0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
22cb0 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  af ){.      chld
22cc0 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Pg = 0;.    }els
22cd0 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65  e if( lwr>=pPage
22ce0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
22cf0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
22d00 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
22d10 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
22d20 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
22d30 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
22d40 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
22d50 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b  ll(pPage, lwr));
22d60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
22d70 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  hldPg==0 ){.    
22d80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
22d90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
22da0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
22db0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
22dc0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
22dd0 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
22de0 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
22df0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
22e00 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
22e10 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
22e20 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22e30 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72  Page] = (u16)lwr
22e40 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
22e50 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
22e60 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
22e70 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
22e80 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
22e90 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
22ea0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
22eb0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
22ec0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72  veto_finish:.  r
22ed0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
22ee0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
22ef0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
22f00 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   not pointing at
22f10 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65   an entry of the
22f20 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52   table..**.** TR
22f30 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  UE will be retur
22f40 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c  ned after a call
22f50 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
22f60 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20  Next() moves.** 
22f70 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e  past the last en
22f80 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
22f90 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65   or sqlite3Btree
22fa0 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73  Prev() moves pas
22fb0 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65  t.** the first e
22fc0 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61  ntry.  TRUE is a
22fd0 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
22fe0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
22ff0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
23000 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72  e3BtreeEof(BtCur
23010 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
23020 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74   TODO: What if t
23030 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20  he cursor is in 
23040 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
23050 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65  EK but all table
23060 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61   entries.  ** ha
23070 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f  ve been deleted?
23080 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e   This API will n
23090 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f  eed to change to
230a0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
230b0 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65   code.  ** as we
230c0 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61  ll as the boolea
230d0 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a  n result value..
230e0 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43    */.  return (C
230f0 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75  URSOR_VALID!=pCu
23100 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f  r->eState);.}../
23110 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
23120 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
23130 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
23140 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a   database.  If.*
23150 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65  * successful the
23160 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20  n set *pRes=0.  
23170 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  If the cursor.**
23180 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69   was already poi
23190 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
231a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
231b0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
231c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
231d0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
231e0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
231f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23200 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
23210 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
23220 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
23230 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20   idx;.  MemPage 
23240 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
23250 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
23260 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
23270 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
23280 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
23290 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
232a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
232b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
232c0 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
232d0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
232e0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
232f0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
23300 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
23310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
23320 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e   if( pCur->skip>
23330 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
23340 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
23350 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
23360 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23370 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
23380 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
23390 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
233a0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
233b0 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
233c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
233d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
233e0 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
233f0 74 28 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e  t( idx<=pPage->n
23400 43 65 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d  Cell );..  pCur-
23410 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
23420 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
23430 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64  ey = 0;.  if( id
23440 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
23450 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
23460 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
23470 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23480 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
23490 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
234a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
234b0 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
234c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
234d0 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
234e0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
234f0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
23500 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
23510 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  c;.    }.    do{
23520 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
23530 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
23540 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
23550 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
23560 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
23570 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
23580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
235a0 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
235b0 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
235c0 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
235d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
235e0 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69  iPage];.    }whi
235f0 6c 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  le( pCur->aiIdx[
23600 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
23610 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
23620 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23630 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
23640 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
23650 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
23660 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
23670 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23680 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23690 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
236a0 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73   rc;.  }.  *pRes
236b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
236c0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72  e->leaf ){.    r
236d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
236e0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65  .  }.  rc = move
236f0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
23700 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23710 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  .../*.** Step th
23720 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
23730 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
23740 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
23750 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
23760 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
23770 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
23780 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
23790 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
237a0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
237b0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
237c0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
237d0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
237e0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
237f0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
23800 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23810 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
23820 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
23830 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
23840 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23850 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
23860 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23870 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
23880 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
23890 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
238a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
238b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
238c0 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74  ;.  }.  pCur->at
238d0 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Last = 0;.  if( 
238e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
238f0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
23900 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
23910 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
23920 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
23930 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20  Cur->skip<0 ){. 
23940 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20     pCur->skip = 
23950 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  0;.    *pRes = 0
23960 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
23970 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43  ITE_OK;.  }.  pC
23980 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20  ur->skip = 0;.. 
23990 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
239a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
239b0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
239c0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
239d0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
239e0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
239f0 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   = pCur->aiIdx[p
23a00 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
23a10 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
23a20 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
23a30 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
23a40 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
23a50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
23a60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23a70 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
23a80 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
23a90 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
23aa0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23ab0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
23ac0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
23ad0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
23ae0 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
23af0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
23b00 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
23b10 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
23b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23b30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
23b40 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54  qlite3BtreeMoveT
23b50 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
23b60 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
23b70 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23b80 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b     pCur->validNK
23b90 65 79 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75  ey = 0;..    pCu
23ba0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23bb0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
23bc0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
23bd0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
23be0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
23bf0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
23c00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
23c10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
23c20 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
23c30 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
23c40 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
23c50 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
23c60 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
23c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23c80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
23c90 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ew page from the
23ca0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
23cb0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61  **.** The new pa
23cc0 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ge is marked as 
23cd0 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65  dirty.  (In othe
23ce0 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33  r words, sqlite3
23cf0 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20  PagerWrite().** 
23d00 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
23d10 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e   called on the n
23d20 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e  ew page.)  The n
23d30 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f  ew page has also
23d40 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e  .** been referen
23d50 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c  ced and the call
23d60 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72  ing routine is r
23d70 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
23d80 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65  alling.** sqlite
23d90 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e  3PagerUnref() on
23da0 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77 68   the new page wh
23db0 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a  en it is done..*
23dc0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
23dd0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
23de0 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65  ccess.  Any othe
23df0 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  r return value i
23e00 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65  ndicates.** an e
23e10 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61  rror.  *ppPage a
23e20 6e 64 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e  nd *pPgno are un
23e30 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65  defined in the e
23e40 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
23e50 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f  ..** Do not invo
23e60 6b 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ke sqlite3PagerU
23e70 6e 72 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67  nref() on *ppPag
23e80 65 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73  e if an error is
23e90 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
23ea0 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79 22   If the "nearby"
23eb0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
23ec0 74 20 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65  t 0, then a (fee
23ed0 62 6c 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d  ble) effort is m
23ee0 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
23ef0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
23f00 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
23f10 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
23f20 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
23f30 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
23f40 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
23f50 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
23f60 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
23f70 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
23f80 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
23f90 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
23fa0 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
23fb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65  .**.** If the "e
23fc0 78 61 63 74 22 20 70 61 72 61 6d 65 74 65 72 20  xact" parameter 
23fd0 69 73 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68  is not 0, and th
23fe0 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65  e page-number ne
23ff0 61 72 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20  arby exists .** 
24000 61 6e 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20  anywhere on the 
24010 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20  free-list, then 
24020 69 74 20 69 73 20 67 75 61 72 65 6e 74 65 65 64  it is guarenteed
24030 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e   to be returned.
24040 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
24050 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
24060 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 20 77  cuum databases w
24070 68 65 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61  hen allocating a
24080 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73   new table..*/.s
24090 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
240a0 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20 42  teBtreePage(.  B
240b0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20  tShared *pBt, . 
240c0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
240d0 65 2c 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e  e, .  Pgno *pPgn
240e0 6f 2c 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62  o, .  Pgno nearb
240f0 79 2c 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b  y,.  u8 exact.){
24100 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24110 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e1;.  int rc;.  
24120 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 n;     /* Nu
24130 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
24140 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
24150 0a 20 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a  .  u32 k;     /*
24160 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65   Number of leave
24170 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f  s on the trunk o
24180 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a  f the freelist *
24190 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72  /.  MemPage *pTr
241a0 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  unk = 0;.  MemPa
241b0 67 65 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d  ge *pPrevTrunk =
241c0 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67   0;.  Pgno mxPag
241d0 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20  e;     /* Total 
241e0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
241f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  base file */..  
24200 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24210 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
24220 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
24230 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
24240 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 70 61 67  ;.  mxPage = pag
24250 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
24260 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
24270 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
24280 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d 78  36]);.  if( n>mx
24290 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
242a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
242b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
242c0 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
242d0 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
242e0 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
242f0 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
24300 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
24310 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
24320 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
24330 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
24340 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
24350 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
24360 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
24370 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27  .    /* If the '
24380 65 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72  exact' parameter
24390 20 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20   was true and a 
243a0 71 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69  query of the poi
243b0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20  nter-map.    ** 
243c0 73 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70  shows that the p
243d0 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20  age 'nearby' is 
243e0 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65  somewhere on the
243f0 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e   free-list, then
24400 0a 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69  .    ** the enti
24410 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20  re-list will be 
24420 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61  searched for tha
24430 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23  t page..    */.#
24440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24450 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24460 20 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e    if( exact && n
24470 65 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b  earby<=mxPage ){
24480 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b  .      u8 eType;
24490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
244a0 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
244b0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
244c0 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20  toVacuum );.    
244d0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
244e0 28 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65  (pBt, nearby, &e
244f0 54 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Type, 0);.      
24500 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
24510 72 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  rc;.      if( eT
24520 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
24530 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
24540 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a  searchList = 1;.
24550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
24560 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20  Pgno = nearby;. 
24570 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
24580 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
24590 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
245a0 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
245b0 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
245c0 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
245d0 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
245e0 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
245f0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
24600 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
24610 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24620 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
24630 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
24640 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
24650 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
24660 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
24670 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
24680 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
24690 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
246a0 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
246b0 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
246c0 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
246d0 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
246e0 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
246f0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
24700 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
24710 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
24720 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
24730 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
24740 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
24750 6f 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54  o {.      pPrevT
24760 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  runk = pTrunk;. 
24770 20 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72       if( pPrevTr
24780 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
24790 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
247a0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
247b0 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d  ata[0]);.      }
247c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
247d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
247e0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
247f0 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  2]);.      }.   
24800 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
24810 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
24820 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
24830 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
24840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
24850 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
24860 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
24870 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
24880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24890 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
248a0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
248b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
248c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
248d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
248e0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
248f0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
24900 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
24910 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
24920 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
24930 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
24940 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
24950 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
24960 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
24970 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
24980 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
24990 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
249a0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
249b0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
249c0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
249d0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
249e0 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
249f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
24a00 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
24a10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
24a20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
24a30 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
24a40 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
24a50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24a60 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
24a70 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
24a80 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
24a90 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
24aa0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
24ab0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
24ac0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
24ad0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
24ae0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
24af0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
24b00 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
24b10 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
24b20 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
24b30 20 69 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74   if( k>(u32)(pBt
24b40 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
24b50 20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f   2) ){.        /
24b60 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
24b70 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
24b80 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
24b90 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
24ba0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
24bb0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
24bc0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
24bd0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
24be0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
24bf0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
24c00 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
24c10 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
24c20 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
24c30 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
24c40 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
24c50 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
24c60 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
24c70 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
24c80 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
24c90 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
24ca0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
24cb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
24cc0 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
24cd0 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
24ce0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
24cf0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
24d00 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
24d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
24d20 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
24d30 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
24d40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
24d50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24d60 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
24d70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24d80 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
24d90 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
24da0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
24db0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
24dc0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24dd0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
24de0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
24df0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24e00 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
24e10 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
24e20 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
24e30 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
24e40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
24e50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
24e60 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
24e70 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
24e80 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
24e90 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
24ea0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
24eb0 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
24ec0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
24ed0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
24ee0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
24ef0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
24f00 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
24f10 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
24f20 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
24f30 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
24f40 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
24f50 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
24f60 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
24f70 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e    if( iNewTrunk>
24f80 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20  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 20 20 20 20 20 20 67 6f 74  .            got
24fc0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
24fd0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
24fe0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24ff0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
25000 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
25010 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
25020 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
25030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25040 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
25050 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25060 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
25070 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
25080 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25090 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
250a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
250b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
250c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
250d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
250e0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
250f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
25100 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
25110 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25120 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
25130 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
25140 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
25150 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
25160 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
25170 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
25180 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
25190 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
251a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
251b0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
251c0 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
251d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
251e0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
251f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
25200 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
25210 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
25220 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
25230 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
25240 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
25250 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
25260 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
25270 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
25280 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
25290 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
252a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
252b0 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
252c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
252d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
252e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
252f0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25300 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25310 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25320 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
25330 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
25340 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
25350 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25360 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
25370 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
25380 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
25390 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
253a0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
253b0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
253c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
253d0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
253e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
253f0 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
25400 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
25410 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
25420 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
25430 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
25440 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
25450 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
25460 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ta;.        rc =
25470 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25480 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
25490 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
254a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
254b0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
254c0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
254d0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
254e0 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
254f0 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
25500 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a        int dist;.
25510 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
25520 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
25530 20 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65   dist = get4byte
25540 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65  (&aData[8]) - ne
25550 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20  arby;.          
25560 69 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73  if( dist<0 ) dis
25570 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20  t = -dist;.     
25580 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c       for(i=1; i<
25590 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
255a0 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65       int d2 = ge
255b0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
255c0 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a  i*4]) - nearby;.
255d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
255e0 64 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b  d2<0 ) d2 = -d2;
255f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25600 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
25610 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
25620 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
25630 20 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a       dist = d2;.
25640 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
25650 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
25670 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
25680 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
25690 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62     iPage = get4b
256a0 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  yte(&aData[8+clo
256b0 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20  sest*4]);.      
256c0 20 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61    if( iPage>mxPa
256d0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
256e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
256f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
25700 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
25710 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
25720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25730 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c  ( !searchList ||
25740 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29   iPage==nearby )
25750 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
25760 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20  noContent;.     
25770 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b       Pgno nPage;
25780 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
25790 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
257a0 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67       nPage = pag
257b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
257c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
257d0 69 50 61 67 65 3e 6e 50 61 67 65 20 29 7b 0a 20  iPage>nPage ){. 
257e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
257f0 65 65 20 70 61 67 65 20 6f 66 66 20 74 68 65 20  ee page off the 
25800 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
25810 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  */.            r
25820 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25830 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
25840 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
25850 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
25860 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25870 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
25880 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66  ATE: %d was leaf
25890 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75   %d of %d on tru
258a0 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20  nk %d".         
258b0 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f          ": %d mo
258c0 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22  re free pages\n"
258d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
258e0 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65     *pPgno, close
258f0 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d  st+1, k, pTrunk-
25900 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  >pgno, n-1));.  
25910 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
25920 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
25930 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
25940 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
25950 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
25960 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
25970 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
25980 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
25990 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
259a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
259b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
259c0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
259d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   );.          no
259e0 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65  Content = !btree
259f0 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  GetHasContent(pB
25a00 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20  t, *pPgno);.    
25a10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25a20 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
25a30 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
25a40 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
25a50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
25a60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25a70 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
25a80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25a90 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
25aa0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
25ab0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
25ac0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25ad0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25ae0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
25af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25b00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25b10 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
25b20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25b30 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
25b40 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
25b50 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
25b60 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
25b70 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
25b80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
25b90 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
25ba0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
25bb0 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61  ist, so create a
25bc0 20 6e 65 77 20 70 61 67 65 20 61 74 20 74 68 65   new page at the
25bd0 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  .    ** end of t
25be0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69  he file */.    i
25bf0 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72  nt nPage = pager
25c00 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
25c10 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61      *pPgno = nPa
25c20 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28  ge + 1;..    if(
25c30 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47   *pPgno==PENDING
25c40 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
25c50 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  ){.      (*pPgno
25c60 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  )++;.    }..#ifn
25c70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25c80 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
25c90 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
25ca0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
25cb0 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29  AGE(pBt, *pPgno)
25cc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25cd0 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f  *pPgno refers to
25ce0 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
25cf0 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77  age, allocate tw
25d00 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20  o new pages.    
25d10 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20    ** at the end 
25d20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74  of the file inst
25d30 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20  ead of one. The 
25d40 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20  first allocated 
25d50 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65  page.      ** be
25d60 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e  comes a new poin
25d70 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68  ter-map page, th
25d80 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64  e second is used
25d90 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
25da0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d        */.      M
25db0 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b  emPage *pPg = 0;
25dc0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41  .      TRACE(("A
25dd0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
25de0 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f   end of file (po
25df0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c  inter-map page)\
25e00 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
25e10 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67      assert( *pPg
25e20 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
25e30 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20  _PAGE(pBt) );.  
25e40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25e50 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
25e60 2c 20 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20  , *pPgno, &pPg, 
25e70 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
25e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25e90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
25ea0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
25eb0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
25ec0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
25ed0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
25ee0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
25ef0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28  turn rc;.      (
25f00 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  *pPgno)++;.     
25f10 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
25f20 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
25f30 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b  Bt) ){ (*pPgno)+
25f40 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
25f50 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  f..    assert( *
25f60 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
25f70 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
25f80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25f90 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
25fa0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
25fb0 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
25fc0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
25fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25fe0 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61  agerWrite((*ppPa
25ff0 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge)->pDbPage);. 
26000 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26010 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
26020 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
26030 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  e);.    }.    TR
26040 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
26050 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66  %d from end of f
26060 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29  ile\n", *pPgno))
26070 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
26080 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
26090 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
260a0 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  );..end_allocate
260b0 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65  _page:.  release
260c0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
260d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65  releasePage(pPre
260e0 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72  vTrunk);.  if( r
260f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26100 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50      if( sqlite3P
26110 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
26120 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
26130 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20  age)>1 ){.      
26140 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
26150 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  age);.      retu
26160 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
26170 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
26180 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49    (*ppPage)->isI
26190 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  nit = 0;.  }else
261a0 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20  {.    *ppPage = 
261b0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
261c0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
261d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
261e0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
261f0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
26200 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
26210 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
26220 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
26230 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
26240 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
26250 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
26260 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
26270 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
26280 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
26290 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
262a0 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
262b0 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
262c0 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
262d0 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
262e0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
262f0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
26300 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
26310 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
26320 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
26330 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
26340 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
26350 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
26360 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
26370 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
26380 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
26390 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
263a0 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
263b0 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
263c0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
263d0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
263e0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
263f0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
26400 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
26410 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
26420 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
26430 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26440 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
26450 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
26460 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
26470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26480 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
26490 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
264a0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
264b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
264c0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
264d0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
264e0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
264f0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
26500 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
26510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
26520 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
26530 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
26540 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26560 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
26570 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
26580 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
265a0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
265b0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
265c0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
265d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
265e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
265f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26600 20 69 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73   iPage>1 );.  as
26610 73 65 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20  sert( !pMemPage 
26620 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e  || pMemPage->pgn
26630 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69  o==iPage );..  i
26640 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20  f( pMemPage ){. 
26650 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50     pPage = pMemP
26660 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  age;.    sqlite3
26670 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e  PagerRef(pPage->
26680 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73  pDbPage);.  }els
26690 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62  e{.    pPage = b
266a0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
266b0 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a  Bt, iPage);.  }.
266c0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
266d0 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f  the free page co
266e0 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f  unt on pPage1 */
266f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
26700 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
26710 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
26720 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
26730 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65  page_out;.  nFre
26740 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  e = get4byte(&pP
26750 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
26760 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
26770 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
26780 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64   nFree+1);..#ifd
26790 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
267a0 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20  _DELETE.  /* If 
267b0 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52  the SQLITE_SECUR
267c0 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65  E_DELETE compile
267d0 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20  -time option is 
267e0 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20  enabled, then.  
267f0 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
26800 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
26810 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
26820 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20  th zeros..  */. 
26830 20 69 66 28 20 28 21 70 50 61 67 65 20 26 26 20   if( (!pPage && 
26840 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
26850 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
26860 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
26870 29 29 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20  )).   ||        
26880 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
26890 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
268a0 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29  e->pDbPage)).  )
268b0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
268c0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d  age_out;.  }.  m
268d0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
268e0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
268f0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65  t->pageSize);.#e
26900 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
26910 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
26920 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
26930 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
26940 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
26950 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
26960 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
26970 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
26980 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
26990 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  UM ){.    rc = p
269a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50  trmapPut(pBt, iP
269b0 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45  age, PTRMAP_FREE
269c0 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  PAGE, 0);.    if
269d0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
269e0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
269f0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
26a00 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
26a10 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
26a20 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
26a30 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
26a40 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
26a50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
26a60 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
26a70 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
26a80 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
26a90 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
26aa0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
26ab0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
26ac0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
26ad0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
26ae0 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
26af0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
26b00 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
26b10 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
26b20 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
26b30 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
26b40 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
26b50 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
26b60 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
26b70 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
26b80 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
26b90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
26ba0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ee!=0 ){.    int
26bb0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
26bc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
26bd0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
26be0 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
26bf0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
26c00 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
26c10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
26c20 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ]);.    rc = sql
26c30 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
26c40 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
26c50 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
26c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26c70 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
26c80 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
26c90 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
26ca0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
26cb0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
26cc0 20 69 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b 0a   if( nLeaf<0 ){.
26cd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26ce0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
26cf0 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
26d00 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
26d10 20 20 20 69 66 28 20 6e 4c 65 61 66 3c 70 42 74     if( nLeaf<pBt
26d20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
26d30 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49   8 ){.      /* I
26d40 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72  n this case ther
26d50 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65  e is room on the
26d60 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69   trunk page to i
26d70 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20  nsert the page. 
26d80 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72       ** being fr
26d90 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61  eed as a new lea
26da0 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  f..      **.    
26db0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
26dc0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
26dd0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c   not really full
26de0 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69   until it contai
26df0 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  ns.      ** usab
26e00 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74  leSize/4 - 2 ent
26e10 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65  ries, not usable
26e20 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
26e30 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20  es as we have.  
26e40 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42      ** coded.  B
26e50 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69  ut due to a codi
26e60 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73  ng error in vers
26e70 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70  ions of SQLite p
26e80 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rior to.      **
26e90 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65   3.6.0, database
26ea0 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20  s with freelist 
26eb0 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64  trunk pages hold
26ec0 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20  ing more than.  
26ed0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
26ee0 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
26ef0 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64  will be reported
26f00 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   as corrupt.  In
26f10 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
26f20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b  to maintain back
26f30 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
26f40 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76  ity with older v
26f50 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
26f60 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77  e,.      ** we w
26f70 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72  ill contain to r
26f80 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
26f90 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
26fa0 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
26fb0 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
26fc0 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
26fd0 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
26fe0 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
26ff0 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
27000 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
27010 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
27020 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
27030 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
27040 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
27050 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
27060 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
27070 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
27080 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f  e/4-8"..      */
27090 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
270a0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
270b0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
270c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
270d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
270e0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
270f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
27100 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
27110 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
27120 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
27130 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66  *4], iPage);.#if
27140 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  ndef SQLITE_SECU
27150 52 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20  RE_DELETE.      
27160 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
27170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
27180 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70  PagerDontWrite(p
27190 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
271a0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
271b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
271c0 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
271d0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
271e0 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
271f0 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
27200 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
27210 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
27220 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
27230 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
27240 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
27250 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
27260 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
27270 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
27280 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
27290 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
272a0 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
272b0 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
272c0 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
272d0 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
272e0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
272f0 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
27300 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
27310 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
27320 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
27330 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
27340 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
27350 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
27360 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
27370 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
27380 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
27390 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
273a0 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
273b0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
273c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 20 20 28 28  .  */.  if(   ((
273d0 21 70 50 61 67 65 29 20 26 26 20 28 30 20 21 3d  !pPage) && (0 !=
273e0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74   (rc = sqlite3Bt
273f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
27400 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
27410 29 29 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20  )))).     || (0 
27420 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
27430 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
27440 2d 3e 70 44 62 50 61 67 65 29 29 29 0a 20 20 29  ->pDbPage))).  )
27450 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70  {.    goto freep
27460 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70  age_out;.  }.  p
27470 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  ut4byte(pPage->a
27480 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20  Data, iTrunk);. 
27490 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
274a0 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a  ->aData[4], 0);.
274b0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
274c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
274d0 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28  Page);.  TRACE((
274e0 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e  "FREE-PAGE: %d n
274f0 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65  ew trunk page re
27500 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70  placing %d\n", p
27510 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75  Page->pgno, iTru
27520 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f  nk));..freepage_
27530 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65  out:.  if( pPage
27540 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
27550 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  sInit = 0;.  }. 
27560 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
27570 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  ge);.  releasePa
27580 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
27590 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
275a0 63 20 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d  c int freePage(M
275b0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
275c0 20 20 72 65 74 75 72 6e 20 66 72 65 65 50 61 67    return freePag
275d0 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
275e0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
275f0 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  o);.}../*.** Fre
27600 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
27610 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
27620 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43  with the given C
27630 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
27640 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d  nt clearCell(Mem
27650 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73  Page *pPage, uns
27660 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
27670 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  l){.  BtShared *
27680 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
27690 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
276a0 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67  o;.  Pgno ovflPg
276b0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  no;.  int rc;.  
276c0 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36  int nOvfl;.  u16
276d0 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a   ovflPageSize;..
276e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
276f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
27700 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
27710 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
27720 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
27730 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
27740 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69  o);.  if( info.i
27750 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20  Overflow==0 ){. 
27760 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27770 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72  _OK;  /* No over
27780 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75  flow pages. Retu
27790 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
277a0 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d   anything */.  }
277b0 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
277c0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
277d0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
277e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
277f0 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
27800 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
27810 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
27820 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
27830 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
27840 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
27850 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
27860 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
27870 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67    assert( ovflPg
27880 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30  no==0 || nOvfl>0
27890 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76   );.  while( nOv
278a0 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  fl-- ){.    Pgno
278b0 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20   iNext = 0;.    
278c0 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d  MemPage *pOvfl =
278d0 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c   0;.    if( ovfl
278e0 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67  Pgno<2 || ovflPg
278f0 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
27900 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
27910 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65  /* 0 is not a le
27920 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  gal page number 
27930 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f  and page 1 canno
27940 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a  t be an .      *
27950 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  * overflow page.
27960 20 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76   Therefore if ov
27970 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74  flPgno<2 or past
27980 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27990 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74  .      ** file t
279a0 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
279b0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a   be corrupt. */.
279c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
279d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
279e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
279f0 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
27a00 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
27a10 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
27a20 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
27a30 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
27a40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
27a50 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65    }.    rc = fre
27a60 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
27a70 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
27a80 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
27a90 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
27aa0 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
27ab0 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
27ac0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
27ad0 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
27ae0 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
27af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27b00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
27b10 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
27b20 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
27b30 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
27b40 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
27b50 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
27b60 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
27b70 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
27b80 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
27b90 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
27ba0 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
27bb0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
27bc0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
27bd0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
27be0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
27bf0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
27c00 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
27c10 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
27c20 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
27c30 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
27c40 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
27c50 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
27c60 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
27c70 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
27c80 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
27c90 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
27ca0 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
27cb0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
27cc0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
27cd0 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
27ce0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
27cf0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
27d00 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
27d10 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
27d20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
27d30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
27d40 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
27d50 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
27d60 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
27d70 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
27d80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
27d90 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
27da0 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
27db0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
27dc0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
27dd0 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
27de0 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
27df0 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
27e00 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
27e10 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
27e20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
27e30 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
27e40 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
27e50 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
27e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
27e80 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
27e90 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
27ea0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
27eb0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
27ec0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
27ed0 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
27ee0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
27ef0 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
27f00 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
27f10 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
27f20 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
27f30 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
27f40 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
27f50 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
27f60 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
27f70 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
27f80 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
27f90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
27fa0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
27fb0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
27fc0 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
27fd0 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
27fe0 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
27ff0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
28000 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
28010 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
28020 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
28030 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
28040 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
28050 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
28060 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
28070 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
28080 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
28090 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
280a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
280b0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
280c0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
280d0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
280e0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
280f0 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
28100 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
28110 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
28120 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
28130 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
28140 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
28150 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
28160 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
28170 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28180 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
28190 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
281a0 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
281b0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
281c0 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
281d0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
281e0 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
281f0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
28200 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
28210 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
28220 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
28230 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
28240 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
28250 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
28260 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
28270 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
28280 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
28290 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
282a0 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
282b0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
282c0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
282d0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
282e0 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
282f0 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
28300 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ( nKey>0x7ffffff
28310 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  f || pKey==0 ){.
28320 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
28330 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
28340 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
28350 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
28360 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
28370 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
28380 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
28390 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
283a0 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
283b0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
283c0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
283d0 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
283e0 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
283f0 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
28400 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
28410 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
28420 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
28430 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28440 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28450 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
28460 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
28470 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
28480 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
28490 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
284a0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
284b0 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
284c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
284d0 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
284e0 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
284f0 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
28500 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
28510 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
28520 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
28530 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
28540 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
28550 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
28560 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
28570 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
28580 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
28590 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
285a0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
285b0 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
285c0 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
285d0 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
285e0 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
285f0 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
28600 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
28610 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
28620 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
28630 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
28640 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
28650 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
28660 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
28670 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
28680 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
28690 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
286a0 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
286b0 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
286c0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
286d0 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
286e0 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
286f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
28700 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
28710 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
28720 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
28730 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
28740 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
28750 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
28760 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
28770 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
28780 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
28790 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
287a0 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
287b0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
287c0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
287d0 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
287e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
287f0 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
28800 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
28810 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
28820 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
28830 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
28840 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
28850 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
28860 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
28870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
28880 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
28890 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
288a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
288b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
288c0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
288d0 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
288e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
288f0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
28900 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
28910 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
28920 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
28930 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
28940 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
28950 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
28960 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
28970 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
28980 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
28990 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
289a0 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
289b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
289c0 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
289d0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
289e0 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
289f0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
28a00 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
28a10 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
28a20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
28a30 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
28a40 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
28a50 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
28a60 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
28a70 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
28a80 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
28a90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
28aa0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28ab0 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
28ac0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
28ad0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
28ae0 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
28af0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28b00 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
28b10 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
28b20 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
28b30 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
28b40 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
28b50 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
28b60 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
28b70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
28b80 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
28b90 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
28ba0 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
28bb0 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
28bc0 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
28bd0 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
28be0 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
28bf0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
28c00 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
28c10 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
28c20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
28c30 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
28c40 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
28c50 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
28c60 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
28c70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
28c80 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
28c90 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28ca0 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
28cb0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
28cc0 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
28cd0 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
28ce0 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
28cf0 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
28d00 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
28d10 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
28d20 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
28d30 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
28d40 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
28d50 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
28d60 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
28d70 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
28d80 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
28d90 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
28da0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
28db0 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
28dc0 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
28dd0 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
28de0 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
28df0 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
28e00 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
28e10 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
28e20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
28e30 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
28e40 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
28e50 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
28e60 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
28e70 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
28e80 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
28e90 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
28ea0 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
28eb0 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
28ec0 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
28ed0 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
28ee0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
28ef0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
28f00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28f10 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
28f20 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
28f30 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
28f40 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
28f50 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
28f60 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
28f70 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
28f80 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
28f90 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
28fa0 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
28fb0 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
28fc0 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
28fd0 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
28fe0 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
28ff0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
29000 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
29010 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
29020 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
29030 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
29040 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
29050 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65  tatic int dropCe
29060 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
29070 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
29080 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
29090 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
290a0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
290b0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
290c0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
290d0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
290e0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
290f0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
29100 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
29110 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
29120 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
29130 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
29140 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
29150 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
29160 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
29170 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
29180 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
29190 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
291a0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
291b0 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
291c0 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
291d0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
291e0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
291f0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
29200 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29210 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29220 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29230 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
29240 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
29250 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
29260 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
29270 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
29280 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20  yte(ptr);.  if( 
29290 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66  (pc<pPage->hdrOf
292a0 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
292b0 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c  eaf?0:4)).     |
292c0 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e  | (pc+sz>pPage->
292d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
292e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
292f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29300 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  PT;.  }.  rc = f
29310 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
29320 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
29330 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
29340 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
29350 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
29360 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
29370 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
29380 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
29390 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
293a0 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
293b0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
293c0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
293d0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
293e0 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
293f0 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
29400 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75  ree += 2;.  retu
29410 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29420 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
29430 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
29440 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
29450 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
29460 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
29470 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
29480 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
29490 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
294a0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
294b0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
294c0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
294d0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
294e0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
294f0 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
29500 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
29510 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
29520 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
29530 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
29540 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
29550 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
29560 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
29570 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
29580 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
29590 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
295a0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
295b0 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
295c0 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
295d0 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
295e0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
295f0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
29600 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
29610 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29620 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
29630 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
29640 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
29650 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
29660 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
29670 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
29680 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
29690 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
296a0 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
296b0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
296c0 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
296d0 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
296e0 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
296f0 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
29700 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
29710 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
29720 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
29730 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
29740 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28   int insertCell(
29750 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29760 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
29770 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
29780 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
29790 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
297a0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
297b0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
297c0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
297d0 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
297e0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
297f0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
29800 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
29810 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
29820 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
29830 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
29840 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
29850 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
29860 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
29870 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
29880 68 69 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66  hild       /* If
29890 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
298a0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
298b0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
298c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
298d0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
298e0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
298f0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
29900 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
29910 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
29920 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
29930 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
29940 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
29950 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
29960 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
29970 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
29980 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
29990 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
299a0 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
299b0 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
299c0 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  erted */.  int c
299d0 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
299e0 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
299f0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
29a00 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
29a10 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
29a20 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
29a30 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
29a40 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
29a50 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
29a60 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
29a70 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
29a80 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74  data[] */..  int
29a90 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
29aa0 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73   ? 4 : 0);..  as
29ab0 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
29ac0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
29ad0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
29ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29af0 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
29b00 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
29b10 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
29b20 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
29b30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29b40 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
29b50 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
29b60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29b70 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
29b80 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
29b90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29ba0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29bb0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29bc0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
29bd0 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
29be0 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
29bf0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
29c00 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
29c10 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
29c20 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
29c30 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
29c40 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
29c50 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
29c60 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
29c70 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
29c80 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
29c90 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
29ca0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
29cb0 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
29cc0 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
29cd0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
29ce0 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
29cf0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
29d00 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
29d10 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
29d20 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  dx = (u16)i;.  }
29d30 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
29d40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
29d50 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
29d60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29d70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29d80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29d90 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29da0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
29db0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
29dc0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29dd0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29de0 44 61 74 61 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  Data;.    cellOf
29df0 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
29e00 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
29e10 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
29e20 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
29e30 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f  .    ins = cellO
29e40 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20  ffset + 2*i;.   
29e50 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70   rc = allocateSp
29e60 61 63 65 28 70 50 61 67 65 2c 20 73 7a 2c 20 26  ace(pPage, sz, &
29e70 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 72 63  idx);.    if( rc
29e80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29e90 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 65    assert( idx>=e
29ea0 6e 64 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20  nd+2 );.    if( 
29eb0 69 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e  idx+sz > pPage->
29ec0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
29ed0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
29ee0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29ef0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  KPT;.    }.    p
29f00 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
29f10 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
29f20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29  -= (u16)(2 + sz)
29f30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
29f40 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
29f50 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
29f60 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20 69  Skip);.    if( i
29f70 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
29f80 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
29f90 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
29fa0 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64   }.    for(j=end
29fb0 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20  , ptr=&data[j]; 
29fc0 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72  j>ins; j-=2, ptr
29fd0 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b  -=2){.      ptr[
29fe0 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20  0] = ptr[-2];.  
29ff0 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
2a000 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [-1];.    }.    
2a010 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  put2byte(&data[i
2a020 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70  ns], idx);.    p
2a030 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 50  ut2byte(&data[pP
2a040 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33  age->hdrOffset+3
2a050 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
2a060 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2a070 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2a080 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2a090 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2a0a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
2a0b0 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
2a0c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
2a0d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
2a0e0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
2a0f0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
2a100 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
2a110 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
2a120 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
2a130 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
2a140 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  n ptrmapPutOvflP
2a150 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2a160 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
2a170 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
2a180 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2a190 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
2a1a0 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
2a1b0 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
2a1c0 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
2a1d0 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
2a1e0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
2a1f0 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
2a200 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
2a210 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
2a220 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
2a230 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
2a240 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
2a250 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
2a260 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
2a270 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2a280 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
2a290 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2a2a0 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
2a2b0 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
2a2c0 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
2a2d0 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
2a2e0 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
2a2f0 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
2a300 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2a310 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
2a320 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b  .  u8 *pCellptr;
2a330 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
2a340 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69  of next cell poi
2a350 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  nter */.  int ce
2a360 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41  llbody;     /* A
2a370 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
2a380 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38  ell body */.  u8
2a390 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20   * const data = 
2a3a0 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
2a3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2a3c0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72  nter to data for
2a3d0 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2a3e0 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
2a3f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
2a400 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2a410 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70  t of header on p
2a420 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Page */.  const 
2a430 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50  int nUsable = pP
2a440 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2a450 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20  Size; /* Usable 
2a460 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a  size of page */.
2a470 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a480 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2a490 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a4a0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a4b0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2a4c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
2a4d0 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c  Cell>=0 && nCell
2a4e0 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
2a4f0 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c  >pBt) && MX_CELL
2a500 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34  (pPage->pBt)<=54
2a510 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  60 );.  assert( 
2a520 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2a530 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
2a540 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
2a550 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
2a560 70 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65  page has just be
2a570 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72  en zeroed by zer
2a580 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73  oPage() */.  ass
2a590 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2a5a0 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  l==0 );.  assert
2a5b0 28 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ( get2byte(&data
2a5c0 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c  [hdr+5])==nUsabl
2a5d0 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72  e );..  pCellptr
2a5e0 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
2a5f0 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65  cellOffset + nCe
2a600 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64  ll*2];.  cellbod
2a610 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66  y = nUsable;.  f
2a620 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e  or(i=nCell-1; i>
2a630 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43  =0; i--){.    pC
2a640 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20  ellptr -= 2;.   
2a650 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69   cellbody -= aSi
2a660 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ze[i];.    put2b
2a670 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65  yte(pCellptr, ce
2a680 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d  llbody);.    mem
2a690 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f  cpy(&data[cellbo
2a6a0 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20  dy], apCell[i], 
2a6b0 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20  aSize[i]);.  }. 
2a6c0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2a6d0 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
2a6e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
2a6f0 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64  [hdr+5], cellbod
2a700 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  y);.  pPage->nFr
2a710 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b  ee -= (nCell*2 +
2a720 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62   nUsable - cellb
2a730 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2a740 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c  Cell = (u16)nCel
2a750 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  l;.}../*.** The 
2a760 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65  following parame
2a770 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68  ters determine h
2a780 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74  ow many adjacent
2a790 20 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c   pages get invol
2a7a0 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61  ved.** in a bala
2a7b0 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
2a7c0 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62    NN is the numb
2a7d0 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20  er of neighbors 
2a7e0 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a  on either side.*
2a7f0 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68  * of the page th
2a800 61 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69  at participate i
2a810 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
2a820 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69  operation.  NB i
2a830 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e  s the.** total n
2a840 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
2a850 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c  hat participate,
2a860 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74   including the t
2a870 61 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a  arget page and.*
2a880 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f  * NN neighbors o
2a890 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a  n either side..*
2a8a0 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d  *.** The minimum
2a8b0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20   value of NN is 
2a8c0 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20  1 (of course).  
2a8d0 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62  Increasing NN ab
2a8e0 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f  ove 1.** (to 2 o
2a8f0 72 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64  r 3) gives a mod
2a900 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  est improvement 
2a910 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45  in SELECT and DE
2a920 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65  LETE performance
2a930 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20  .** in exchange 
2a940 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67  for a larger deg
2a950 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45  radation in INSE
2a960 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65  RT and UPDATE pe
2a970 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
2a980 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70  e value of NN ap
2a990 70 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68  pears to give th
2a9a0 65 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f  e best results o
2a9b0 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69  verall..*/.#defi
2a9c0 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20  ne NN 1         
2a9d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2a9e0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
2a9f0 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61  ther side of pPa
2aa00 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42  ge */.#define NB
2aa10 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f   (NN*2+1)      /
2aa20 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e  * Total pages in
2aa30 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61  volved in the ba
2aa40 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64  lance */...#ifnd
2aa50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51  ef SQLITE_OMIT_Q
2aa60 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a  UICKBALANCE./*.*
2aa70 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f  * This version o
2aa80 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64  f balance() hand
2aa90 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73  les the common s
2aaa0 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72  pecial case wher
2aab0 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79  e.** a new entry
2aac0 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74   is being insert
2aad0 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d  ed on the extrem
2aae0 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74  e right-end of t
2aaf0 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f  he.** tree, in o
2ab00 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e  ther words, when
2ab10 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77   the new entry w
2ab20 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ill become the l
2ab30 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20  argest.** entry 
2ab40 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a  in the tree..**.
2ab50 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72  ** Instead of tr
2ab60 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65  ying balance the
2ab70 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65   3 right-most le
2ab80 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61  af pages, just a
2ab90 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65  dd.** a new page
2aba0 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61   to the right-ha
2abb0 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20  nd side and put 
2abc0 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72  the one new entr
2abd0 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67  y in.** that pag
2abe0 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20  e.  This leaves 
2abf0 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f  the right side o
2ac00 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77  f the tree somew
2ac10 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65  hat.** unbalance
2ac20 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65  d.  But odds are
2ac30 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
2ac40 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65   inserting new e
2ac50 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65  ntries.** at the
2ac60 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77   end soon afterw
2ac70 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72  ards so the near
2ac80 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69  ly empty page wi
2ac90 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69  ll quickly.** fi
2aca0 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61  ll up.  On avera
2acb0 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20  ge..**.** pPage 
2acc0 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  is the leaf page
2acd0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69   which is the ri
2ace0 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e  ght-most page in
2acf0 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50   the tree..** pP
2ad00 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72  arent is its par
2ad10 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74  ent.  pPage must
2ad20 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f   have a single o
2ad30 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a  verflow entry.**
2ad40 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74   which is also t
2ad50 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2ad60 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  try on the page.
2ad70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63  .**.** The pSpac
2ad80 65 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  e buffer is used
2ad90 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70   to store a temp
2ada0 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68  orary copy of th
2adb0 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c  e divider.** cel
2adc0 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69  l that will be i
2add0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61  nserted into pPa
2ade0 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c  rent. Such a cel
2adf0 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
2ae00 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e  4.** byte page n
2ae10 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62  umber followed b
2ae20 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  y a variable len
2ae30 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20  gth integer. In 
2ae40 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
2ae50 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73  at most 13 bytes
2ae60 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61  . Hence the pSpa
2ae70 63 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  ce buffer must b
2ae80 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33  e at.** least 13
2ae90 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
2aea0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2aeb0 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50  lance_quick(MemP
2aec0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65  age *pParent, Me
2aed0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
2aee0 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53   *pSpace){.  BtS
2aef0 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74  hared *const pBt
2af00 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20   = pPage->pBt;  
2af10 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61    /* B-Tree Data
2af20 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  base */.  MemPag
2af30 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af50 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65  * Newly allocate
2af60 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  d page */.  int 
2af70 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
2afa0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
2afb0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
2afc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2afd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77  e number of pNew
2afe0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
2aff0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2b000 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2b010 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2b020 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2b030 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2b040 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2b050 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b060 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2b070 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
2b080 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20  ell<=0 ) return 
2b090 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b0a0 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  KPT;..  /* Alloc
2b0b0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20  ate a new page. 
2b0c0 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  This page will b
2b0d0 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d  ecome the right-
2b0e0 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a  sibling of .  **
2b0f0 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65   pPage. Make the
2b100 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69   parent page wri
2b110 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74  table, so that t
2b120 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
2b130 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ell.  ** may be 
2b140 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74  inserted. If bot
2b150 68 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f  h these operatio
2b160 6e 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75  ns are successfu
2b170 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f  l, proceed..  */
2b180 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2b190 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2b1a0 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20  pNew, &pgnoNew, 
2b1b0 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63  0, 0);..  if( rc
2b1c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a  ==SQLITE_OK ){..
2b1d0 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26      u8 *pOut = &
2b1e0 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75  pSpace[4];.    u
2b1f0 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65  8 *pCell = pPage
2b200 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
2b210 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c  ;.    u16 szCell
2b220 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2b230 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2b240 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20    u8 *pStop;..  
2b250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b260 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2b270 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29  e(pNew->pDbPage)
2b280 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2b290 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d  pPage->aData[0]=
2b2a0 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  =(PTF_INTKEY|PTF
2b2b0 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45  _LEAFDATA|PTF_LE
2b2c0 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50  AF) );.    zeroP
2b2d0 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e  age(pNew, PTF_IN
2b2e0 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54  TKEY|PTF_LEAFDAT
2b2f0 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20  A|PTF_LEAF);.   
2b300 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e   assemblePage(pN
2b310 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26  ew, 1, &pCell, &
2b320 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a  szCell);..    /*
2b330 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
2b340 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
2b350 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
2b360 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20  pointer map.    
2b370 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20  ** with entries 
2b380 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65  for the new page
2b390 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65  , and any pointe
2b3a0 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20  r from the .    
2b3b0 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70  ** cell on the p
2b3c0 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c  age to an overfl
2b3d0 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68  ow page. If eith
2b3e0 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20  er of these.    
2b3f0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61  ** operations fa
2b400 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20  ils, the return 
2b410 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74  code is set, but
2b420 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20   the contents.  
2b430 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65    ** of the pare
2b440 6e 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c  nt page are stil
2b450 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79  l manipulated by
2b460 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e   thh code below.
2b470 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20  .    ** That is 
2b480 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  Ok, at this poin
2b490 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
2b4a0 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  e is guaranteed 
2b4b0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72  to.    ** be mar
2b4c0 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65  ked as dirty. Re
2b4d0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
2b4e0 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65   code will cause
2b4f0 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61   a.    ** rollba
2b500 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20  ck, undoing any 
2b510 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20  changes made to 
2b520 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
2b530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2b540 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2b550 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2b560 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
2b570 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
2b580 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
2b590 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c  .      if( szCel
2b5a0 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  l>pNew->minLocal
2b5b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b5c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2b5d0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
2b5e0 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b  tr(pNew, pCell);
2b5f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b600 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20   .    /* Create 
2b610 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74  a divider cell t
2b620 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50  o insert into pP
2b630 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64  arent. The divid
2b640 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63  er cell.    ** c
2b650 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62  onsists of a 4-b
2b660 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  yte page number 
2b670 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (the page number
2b680 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20   of pPage) and. 
2b690 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65     ** a variable
2b6a0 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75   length key valu
2b6b0 65 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65  e (which must be
2b6c0 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
2b6d0 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61  as the.    ** la
2b6e0 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61  rgest key on pPa
2b6f0 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ge)..    **.    
2b700 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c  ** To find the l
2b710 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65  argest key value
2b720 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74   on pPage, first
2b730 20 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d   find the right-
2b740 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c  most .    ** cel
2b750 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20  l on pPage. The 
2b760 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73  first two fields
2b770 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72   of this cell ar
2b780 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65  e the .    ** re
2b790 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76  cord-length (a v
2b7a0 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69  ariable length i
2b7b0 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33  nteger at most 3
2b7c0 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a  2-bits in size).
2b7d0 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b      ** and the k
2b7e0 65 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69  ey value (a vari
2b7f0 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2b800 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e  ger, may have an
2b810 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a  y value)..    **
2b820 20 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68   The first of th
2b830 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f  e while(...) loo
2b840 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f  ps below skips o
2b850 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c  ver the record-l
2b860 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65  ength.    ** fie
2b870 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77  ld. The second w
2b880 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63  hile(...) loop c
2b890 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61  opies the key va
2b8a0 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20  lue from the.   
2b8b0 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67   ** cell on pPag
2b8c0 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63  e into the pSpac
2b8d0 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f  e buffer..    */
2b8e0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
2b8f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61  dCell(pPage, pPa
2b900 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  ge->nCell-1);.  
2b910 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c    pStop = &pCell
2b920 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
2b930 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30  (*(pCell++)&0x80
2b940 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70  ) && pCell<pStop
2b950 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20   );.    pStop = 
2b960 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77  &pCell[9];.    w
2b970 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b  hile( ((*(pOut++
2b980 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26  ) = *(pCell++))&
2b990 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70  0x80) && pCell<p
2b9a0 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Stop );..    /* 
2b9b0 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64  Insert the new d
2b9c0 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f  ivider cell into
2b9d0 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20   pParent. */.   
2b9e0 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2b9f0 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ent,pParent->nCe
2ba00 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28  ll,pSpace,(int)(
2ba10 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70  pOut-pSpace),0,p
2ba20 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  Page->pgno);..  
2ba30 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67    /* Set the rig
2ba40 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ht-child pointer
2ba50 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70   of pParent to p
2ba60 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2ba70 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74  page. */.    put
2ba80 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2ba90 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2baa0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e  drOffset+8], pgn
2bab0 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a  oNew);.  .    /*
2bac0 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   Release the ref
2bad0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  erence to the ne
2bae0 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72  w page. */.    r
2baf0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
2bb00 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2bb10 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
2bb20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2bb30 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66  KBALANCE */..#if
2bb40 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75   0./*.** This fu
2bb50 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
2bb60 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68  contribute anyth
2bb70 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61  ing to the opera
2bb80 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a  tion of SQLite..
2bb90 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d  ** it is sometim
2bba0 65 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d  es activated tem
2bbb0 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64  porarily while d
2bbc0 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65  ebugging code re
2bbd0 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f  sponsible .** fo
2bbe0 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65  r setting pointe
2bbf0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a  r-map entries..*
2bc00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
2bc10 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65  mapCheckPages(Me
2bc20 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20  mPage **apPage, 
2bc30 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  int nPage){.  in
2bc40 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d  t i, j;.  for(i=
2bc50 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29  0; i<nPage; i++)
2bc60 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20  {.    Pgno n;.  
2bc70 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50    u8 e;.    MemP
2bc80 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50  age *pPage = apP
2bc90 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68  age[i];.    BtSh
2bca0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
2bcb0 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  e->pBt;.    asse
2bcc0 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2bcd0 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d  t );..    for(j=
2bce0 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; j<pPage->nCel
2bcf0 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43  l; j++){.      C
2bd00 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2bd10 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20      u8 *z;.     
2bd20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43  .      z = findC
2bd30 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20  ell(pPage, j);. 
2bd40 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2bd50 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
2bd60 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a  age, z, &info);.
2bd70 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
2bd80 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
2bd90 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20      Pgno ovfl = 
2bda0 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f  get4byte(&z[info
2bdb0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
2bdc0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2bdd0 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26  pBt, ovfl, &e, &
2bde0 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  n);.        asse
2bdf0 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67  rt( n==pPage->pg
2be00 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f  no && e==PTRMAP_
2be10 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20  OVERFLOW1 );.   
2be20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2be30 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2be40 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c         Pgno chil
2be50 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b  d = get4byte(z);
2be60 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47  .        ptrmapG
2be70 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
2be80 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20  e, &n);.        
2be90 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2bea0 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2beb0 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2bec0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2bed0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2bee0 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
2bef0 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26  ild = get4byte(&
2bf00 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2bf10 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2bf20 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47  );.      ptrmapG
2bf30 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26  et(pBt, child, &
2bf40 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73  e, &n);.      as
2bf50 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2bf60 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2bf70 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d  P_BTREE );.    }
2bf80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
2bf90 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2bfa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bfb0 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74  s used to copy t
2bfc0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2bfd0 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73  he b-tree node s
2bfe0 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67  tored .** on pag
2bff0 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20  e pFrom to page 
2c000 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72  pTo. If page pFr
2c010 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61  om was not a lea
2c020 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20  f page, then.** 
2c030 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
2c040 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68  entries for each
2c050 20 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20   child page are 
2c060 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2c070 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61  the.** parent pa
2c080 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ge stored in the
2c090 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20   pointer map is 
2c0a0 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72  page pTo. If pFr
2c0b0 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20  om contained.** 
2c0c0 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f  any cells with o
2c0d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
2c0e0 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20  nters, then the 
2c0f0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f  corresponding po
2c100 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74  inter.** map ent
2c110 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70  ries are also up
2c120 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68  dated so that th
2c130 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73  e parent page is
2c140 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a   page pTo..**.**
2c150 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72   If pFrom is cur
2c160 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20  rently carrying 
2c170 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  any overflow cel
2c180 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74  ls (entries in t
2c190 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f  he.** MemPage.aO
2c1a0 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68  vfl[] array), th
2c1b0 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65  ey are not copie
2c1c0 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a  d to pTo. .**.**
2c1d0 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
2c1e0 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72  g, page pTo is r
2c1f0 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69  einitialized usi
2c200 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  ng sqlite3BtreeI
2c210 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a  nitPage()..**.**
2c220 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   The performance
2c230 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2c240 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61  n is not critica
2c250 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73  l. It is only us
2c260 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61  ed by .** the ba
2c270 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28  lance_shallower(
2c280 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65  ) and balance_de
2c290 65 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65  eper() procedure
2c2a0 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a  s, neither of.**
2c2b0 20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65   which are calle
2c2c0 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f  d often under no
2c2d0 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63  rmal circumstanc
2c2e0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2c2f0 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  t copyNodeConten
2c300 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d  t(MemPage *pFrom
2c310 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b  , MemPage *pTo){
2c320 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f  .  BtShared * co
2c330 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d  nst pBt = pFrom-
2c340 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  >pBt;.  u8 * con
2c350 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d  st aFrom = pFrom
2c360 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20  ->aData;.  u8 * 
2c370 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d  const aTo = pTo-
2c380 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f  >aData;.  int co
2c390 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70  nst iFromHdr = p
2c3a0 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b  From->hdrOffset;
2c3b0 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f  .  int const iTo
2c3c0 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e  Hdr = ((pTo->pgn
2c3d0 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29  o==1) ? 100 : 0)
2c3e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2c3f0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44  ITE_OK;.  int iD
2c400 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ata;..  assert( 
2c410 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b  pFrom->isInit );
2c420 0a 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d  .  assert( pFrom
2c430 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20  ->nFree>=iToHdr 
2c440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74  );.  assert( get
2c450 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2c460 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e  omHdr+5])<=pBt->
2c470 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20  usableSize );.. 
2c480 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74   /* Copy the b-t
2c490 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74  ree node content
2c4a0 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d   from page pFrom
2c4b0 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f   to page pTo. */
2c4c0 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62  .  iData = get2b
2c4d0 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d  yte(&aFrom[iFrom
2c4e0 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70  Hdr+5]);.  memcp
2c4f0 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26  y(&aTo[iData], &
2c500 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42  aFrom[iData], pB
2c510 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44  t->usableSize-iD
2c520 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ata);.  memcpy(&
2c530 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46  aTo[iToHdr], &aF
2c540 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70  rom[iFromHdr], p
2c550 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  From->cellOffset
2c560 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c   + 2*pFrom->nCel
2c570 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74  l);..  /* Reinit
2c580 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20  ialize page pTo 
2c590 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  so that the cont
2c5a0 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  ents of the MemP
2c5b0 61 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  age structure.  
2c5c0 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77  ** match the new
2c5d0 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69   data. The initi
2c5e0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f  alization of pTo
2c5f0 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20   "cannot" fail, 
2c600 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  as the.  ** data
2c610 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72   copied from pFr
2c620 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62  om is known to b
2c630 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70  e valid.  */.  p
2c640 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  To->isInit = 0;.
2c650 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20    TESTONLY(rc = 
2c660 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  ) sqlite3BtreeIn
2c670 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61  itPage(pTo);.  a
2c680 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
2c690 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  E_OK );..  /* If
2c6a0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2c6b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2c6c0 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2c6d0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
2c6e0 0a 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d  .  ** for any b-
2c6f0 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77  tree or overflow
2c700 20 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20   pages that pTo 
2c710 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  now contains the
2c720 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f   pointers to. */
2c730 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43  .  if( ISAUTOVAC
2c740 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  UUM ){.    rc = 
2c750 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2c760 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pTo);.  }.  retu
2c770 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2c780 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64  This routine red
2c790 69 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73  istributes cells
2c7a0 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49   on the iParentI
2c7b0 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70  dx'th child of p
2c7c0 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61  Parent.** (herea
2c7d0 66 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29  fter "the page")
2c7e0 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62   and up to 2 sib
2c7f0 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c  lings so that al
2c800 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f  l pages have abo
2c810 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  ut the.** same a
2c820 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
2c830 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73  ace. Usually a s
2c840 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e  ingle sibling on
2c850 20 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20   either side of 
2c860 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20  the.** page are 
2c870 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
2c880 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f  ncing, though bo
2c890 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68  th siblings migh
2c8a0 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a  t come from one.
2c8b0 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70  ** side if the p
2c8c0 61 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74  age is the first
2c8d0 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
2c8e0 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66  f its parent. If
2c8f0 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61   the page .** ha
2c900 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73  s fewer than 2 s
2c910 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69  iblings (somethi
2c920 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
2c930 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20  y happen if the 
2c940 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f  page.** is a roo
2c950 74 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c  t page or a chil
2c960 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65  d of a root page
2c970 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
2c980 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  able siblings.**
2c990 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20   participate in 
2c9a0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a  the balancing..*
2c9b0 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
2c9c0 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74  of siblings of t
2c9d0 68 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  he page might be
2c9e0 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65   increased or de
2c9f0 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f  creased by .** o
2ca00 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20  ne or two in an 
2ca10 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70  effort to keep p
2ca20 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ages nearly full
2ca30 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75   but not over fu
2ca40 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ll. .**.** Note 
2ca50 74 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72  that when this r
2ca60 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2ca70 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65  , some of the ce
2ca80 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  lls on the page.
2ca90 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74  ** might not act
2caa0 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20  ually be stored 
2cab0 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61  in MemPage.aData
2cac0 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70  []. This can hap
2cad0 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61  pen.** if the pa
2cae0 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20  ge is overfull. 
2caf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73  This routine ens
2cb00 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65  ures that all ce
2cb10 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  lls allocated.**
2cb20 20 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64   to the page and
2cb30 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69   its siblings fi
2cb40 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61  t into MemPage.a
2cb50 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65  Data[] before re
2cb60 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
2cb70 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20  n the course of 
2cb80 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61  balancing the pa
2cb90 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
2cba0 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62  ngs, cells may b
2cbb0 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e  e.** inserted in
2cbc0 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72  to or removed fr
2cbd0 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2cbe0 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f  ge (pParent). Do
2cbf0 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61  ing so.** may ca
2cc00 75 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70  use the parent p
2cc10 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76  age to become ov
2cc20 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66  erfull or underf
2cc30 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20  ull. If this.** 
2cc40 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74  happens, it is t
2cc50 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2cc60 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
2cc70 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f  to invoke the co
2cc80 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69  rrect.** balanci
2cc90 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69  ng routine to fi
2cca0 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28  x this problem (
2ccb0 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28  see the balance(
2ccc0 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a  ) routine). .**.
2ccd0 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
2cce0 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  ne fails for any
2ccf0 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68   reason, it migh
2cd00 74 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  t leave the data
2cd10 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72  base.** in a cor
2cd20 72 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f  rupted state. So
2cd30 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2cd40 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
2cd50 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
2cd60 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
2cd70 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61  *.** The third a
2cd80 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
2cd90 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53  function, aOvflS
2cda0 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74  pace, is a point
2cdb0 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65  er to a.** buffe
2cdc0 72 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  r page-size byte
2cdd0 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69  s in size. If, i
2cde0 6e 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c  n inserting cell
2cdf0 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
2ce00 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65  t.** page (pPare
2ce10 6e 74 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20  nt), the parent 
2ce20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65  page becomes ove
2ce30 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66  rfull, this buff
2ce40 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f  er is.** used to
2ce50 20 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e   store the paren
2ce60 74 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ts overflow cell
2ce70 73 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20  s. Because this 
2ce80 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73  function inserts
2ce90 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  .** a maximum of
2cea0 20 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65   four divider ce
2ceb0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
2cec0 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68  ent page, and th
2ced0 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a  e maximum.** siz
2cee0 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72  e of a cell stor
2cef0 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74  ed within an int
2cf00 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c  ernal node is al
2cf10 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31  ways less than 1
2cf20 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67  /4.** of the pag
2cf30 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66  e-size, the aOvf
2cf40 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20  lSpace[] buffer 
2cf50 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
2cf60 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   be large.** eno
2cf70 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72  ugh for all over
2cf80 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a  flow cells..**.*
2cf90 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20  * If aOvflSpace 
2cfa0 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c  is set to a null
2cfb0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
2cfc0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2cfd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
2cfe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cff0 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2d000 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72  .  MemPage *pPar
2d010 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
2d020 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67     /* Parent pag
2d030 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65  e of siblings be
2d040 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2d050 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78    int iParentIdx
2d060 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d070 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74    /* Index of "t
2d080 68 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72  he page" in pPar
2d090 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76  ent */.  u8 *aOv
2d0a0 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  flSpace,        
2d0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65           /* page
2d0c0 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  -size bytes of s
2d0d0 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20  pace for parent 
2d0e0 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ovfl */.  int is
2d0f0 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20  Root            
2d100 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2d110 65 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20  e if pParent is 
2d120 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29  a root-page */.)
2d130 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
2d140 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d150 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61   /* The whole da
2d160 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
2d170 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  nCell = 0;      
2d180 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d190 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61  er of cells in a
2d1a0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  pCell[] */.  int
2d1b0 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20   nMaxCells = 0; 
2d1c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
2d1d0 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61  ocated size of a
2d1e0 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61  pCell, szCell, a
2d1f0 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e  From. */.  int n
2d200 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
2d210 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d220 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2d230 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  New[] */.  int n
2d240 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  Old;            
2d250 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2d260 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70  r of pages in ap
2d270 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  Old[] */.  int i
2d280 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
2d290 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2d2a0 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
2d2b0 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20  t nxDiv;        
2d2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
2d2d0 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20  xt divider slot 
2d2e0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
2d2f0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  l[] */.  int rc 
2d300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2d310 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
2d320 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  urn code */.  u1
2d330 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  6 leafCorrection
2d340 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20  ;          /* 4 
2d350 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65  if pPage is a le
2d360 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f  af.  0 if not */
2d370 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b  .  int leafData;
2d380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d390 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65  /* True if pPage
2d3a0 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20   is a leaf of a 
2d3b0 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f  LEAFDATA tree */
2d3c0 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61  .  int usableSpa
2d3d0 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ce;             
2d3e0 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67  /* Bytes in pPag
2d3f0 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61  e beyond the hea
2d400 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67  der */.  int pag
2d410 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  eFlags;         
2d420 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2d430 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  f pPage->aData[0
2d440 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f  ] */.  int subto
2d450 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  tal;            
2d460 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20      /* Subtotal 
2d470 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  of bytes in cell
2d480 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f  s on one page */
2d490 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d  .  int iSpace1 =
2d4a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2d4b0 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
2d4c0 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b  byte of aSpace1[
2d4d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c  ] */.  int iOvfl
2d4e0 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20  Space = 0;      
2d4f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
2d500 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66  sed byte of aOvf
2d510 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e  lSpace[] */.  in
2d520 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20  t szScratch;    
2d530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d540 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65  ze of scratch me
2d550 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a  mory requested *
2d560 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f  /.  MemPage *apO
2d570 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  ld[NB];         
2d580 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
2d590 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73   to two siblings
2d5a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2d5b0 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  pCopy[NB];      
2d5c0 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f     /* Private co
2d5d0 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20  pies of apOld[] 
2d5e0 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  pages */.  MemPa
2d5f0 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b  ge *apNew[NB+2];
2d600 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65          /* pPage
2d610 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69   and up to NB si
2d620 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c  blings after bal
2d630 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ancing */.  u8 *
2d640 70 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20  pRight;         
2d650 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2d660 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f  tion in parent o
2d670 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20  f right-sibling 
2d680 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  pointer */.  u8 
2d690 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20  *apDiv[NB-1];   
2d6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
2d6b0 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
2d6c0 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
2d6d0 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
2d6e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2d6f0 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
2d700 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
2d710 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
2d720 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2d730 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
2d740 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
2d750 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
2d760 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
2d770 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
2d780 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
2d790 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
2d7a0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
2d7b0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2d7c0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
2d7d0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
2d7e0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
2d7f0 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
2d800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2d810 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20  pace for copies 
2d820 6f 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c  of dividers cell
2d830 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
2d840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d850 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20      /* Temp var 
2d860 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20  to store a page 
2d870 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20  number in */..  
2d880 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  pBt = pParent->p
2d890 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
2d8a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2d8b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2d8c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2d8d0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2d8e0 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
2d8f0 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20  ge) );..#if 0.  
2d900 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2d910 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
2d920 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
2d930 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
2d940 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e  ent->pgno));.#en
2d950 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69  dif..  /* At thi
2d960 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20  s point pParent 
2d970 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74  may have at most
2d980 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   one overflow ce
2d990 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20  ll. And if.  ** 
2d9a0 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  this overflow ce
2d9b0 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69  ll is present, i
2d9c0 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65  t must be the ce
2d9d0 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e  ll with .  ** in
2d9e0 64 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20  dex iParentIdx. 
2d9f0 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f  This scenario co
2da00 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74  mes about when t
2da10 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  his function.  *
2da20 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64  * is called (ind
2da30 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71  irectly) from sq
2da40 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
2da50 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
2da60 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2da70 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  low==0 || pParen
2da80 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20  t->nOverflow==1 
2da90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2daa0 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  rent->nOverflow=
2dab0 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61  =0 || pParent->a
2dac0 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61  Ovfl[0].idx==iPa
2dad0 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66  rentIdx );..  if
2dae0 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b  ( !aOvflSpace ){
2daf0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2db00 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
2db10 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62   /* Find the sib
2db20 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61  ling pages to ba
2db30 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61  lance. Also loca
2db40 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20  te the cells in 
2db50 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68  pParent .  ** th
2db60 61 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69  at divide the si
2db70 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d  blings. An attem
2db80 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69  pt is made to fi
2db90 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  nd NN siblings o
2dba0 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73  n .  ** either s
2dbb0 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f  ide of pPage. Mo
2dbc0 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  re siblings are 
2dbd0 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73  taken from one s
2dbe0 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20  ide, however, . 
2dbf0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65   ** if there are
2dc00 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73   fewer than NN s
2dc10 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f  iblings on the o
2dc20 74 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50  ther side. If pP
2dc30 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
2dc40 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
2dc50 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
2dc60 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
2dc70 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20   are taken.  .  
2dc80 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
2dc90 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65  p also drops the
2dca0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66   divider cells f
2dcb0 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70  rom the parent p
2dcc0 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77  age. This.  ** w
2dcd0 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65  ay, the remainde
2dce0 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  r of the functio
2dcf0 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  n does not have 
2dd00 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79  to deal with any
2dd10 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63  .  ** overflow c
2dd20 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65  ells in the pare
2dd30 6e 74 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f  nt page, as if o
2dd40 6e 65 20 65 78 69 73 74 65 64 20 69 74 20 68 61  ne existed it ha
2dd50 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62  s already.  ** b
2dd60 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f  een removed.  */
2dd70 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e  .  i = pParent->
2dd80 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72  nOverflow + pPar
2dd90 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66  ent->nCell;.  if
2dda0 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44  ( i<2 ){.    nxD
2ddb0 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64  iv = 0;.    nOld
2ddc0 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b   = i+1;.  }else{
2ddd0 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20  .    nOld = 3;. 
2dde0 20 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64     if( iParentId
2ddf0 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  x==0 ){         
2de00 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e          .      n
2de10 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xDiv = 0;.    }e
2de20 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49  lse if( iParentI
2de30 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e  dx==i ){.      n
2de40 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20  xDiv = i-2;.    
2de50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44  }else{.      nxD
2de60 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d  iv = iParentIdx-
2de70 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  1;.    }.    i =
2de80 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69   2;.  }.  if( (i
2de90 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e  +nxDiv-pParent->
2dea0 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72  nOverflow)==pPar
2deb0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
2dec0 20 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72    pRight = &pPar
2ded0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
2dee0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
2def0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2df00 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c  Right = findCell
2df10 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2df20 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2df30 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e  flow);.  }.  pgn
2df40 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69  o = get4byte(pRi
2df50 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31  ght);.  while( 1
2df60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   ){.    rc = get
2df70 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
2df80 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d   pgno, &apOld[i]
2df90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2dfa0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70  .      memset(ap
2dfb0 4f 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66  Old, 0, i*sizeof
2dfc0 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20  (MemPage*));.   
2dfd0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2dfe0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20  cleanup;.    }. 
2dff0 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20     nMaxCells += 
2e000 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c  1+apOld[i]->nCel
2e010 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65  l+apOld[i]->nOve
2e020 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28  rflow;.    if( (
2e030 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  i--)==0 ) break;
2e040 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e  ..    if( pParen
2e050 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20  t->nOverflow && 
2e060 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74  i+nxDiv==pParent
2e070 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29  ->aOvfl[0].idx )
2e080 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
2e090 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66   = pParent->aOvf
2e0a0 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20  l[0].pCell;.    
2e0b0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
2e0c0 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  e(apDiv[i]);.   
2e0d0 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65     szNew[i] = ce
2e0e0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
2e0f0 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  t, apDiv[i]);.  
2e100 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76      pParent->nOv
2e110 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20  erflow = 0;.    
2e120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44  }else{.      apD
2e130 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c  iv[i] = findCell
2e140 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69  (pParent, i+nxDi
2e150 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72  v-pParent->nOver
2e160 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e  flow);.      pgn
2e170 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  o = get4byte(apD
2e180 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a  iv[i]);.      sz
2e190 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a  New[i] = cellSiz
2e1a0 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70  ePtr(pParent, ap
2e1b0 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20  Div[i]);..      
2e1c0 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c  /* Drop the cell
2e1d0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2e1e0 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20   page. apDiv[i] 
2e1f0 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a  still points to.
2e200 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c        ** the cel
2e210 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72  l within the par
2e220 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  ent, even though
2e230 20 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f   it has been dro
2e240 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54  pped..      ** T
2e250 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
2e260 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63  use dropping a c
2e270 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69  ell only overwri
2e280 74 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20  tes the first.  
2e290 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65      ** four byte
2e2a0 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69  s of it, and thi
2e2b0 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
2e2c0 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72  not need the fir
2e2d0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72  st.      ** four
2e2e0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69   bytes of the di
2e2f0 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74  vider cell. So t
2e300 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61  he pointer is sa
2e310 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20  fe to use.      
2e320 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20  ** later on.  . 
2e330 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
2e340 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69   Unless SQLite i
2e350 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65  s compiled in se
2e360 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65  cure-delete mode
2e370 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a  . In this case,.
2e380 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f        ** the dro
2e390 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20  pCell() routine 
2e3a0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
2e3b0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77  he entire cell w
2e3c0 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20  ith zeroes..    
2e3d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
2e3e0 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63  e, temporarily c
2e3f0 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74  opy the cell int
2e400 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65  o the aOvflSpace
2e410 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66  [].      ** buff
2e420 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63  er. It will be c
2e430 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20  opied out again 
2e440 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61  as soon as the a
2e450 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20  Space[] buffer. 
2e460 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63       ** is alloc
2e470 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66  ated.  */.#ifdef
2e480 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
2e490 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63  ELETE.      memc
2e4a0 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61  py(&aOvflSpace[a
2e4b0 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d  pDiv[i]-pParent-
2e4c0 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69  >aData], apDiv[i
2e4d0 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20  ], szNew[i]);.  
2e4e0 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26      apDiv[i] = &
2e4f0 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76  aOvflSpace[apDiv
2e500 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61  [i]-pParent->aDa
2e510 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ta];.#endif.    
2e520 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65    dropCell(pPare
2e530 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72  nt, i+nxDiv-pPar
2e540 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20  ent->nOverflow, 
2e550 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d  szNew[i]);.    }
2e560 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
2e570 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74  nMaxCells a mult
2e580 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64  iple of 4 in ord
2e590 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38  er to preserve 8
2e5a0 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e  -byte.  ** align
2e5b0 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65  ment */.  nMaxCe
2e5c0 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73  lls = (nMaxCells
2e5d0 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a   + 3)&~3;..  /*.
2e5e0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    ** Allocate sp
2e5f0 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73  ace for memory s
2e600 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20  tructures.  */. 
2e610 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69   k = pBt->pageSi
2e620 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65  ze + ROUND8(size
2e630 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2e640 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
2e650 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
2e660 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e680 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
2e690 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
2e6a0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6c0 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
2e6d0 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   + pBt->pageSize
2e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e700 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20  * aSpace1 */.   
2e710 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20    + k*nOld;     
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28  /* Page copies (
2e750 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43  apCopy) */.  apC
2e760 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
2e770 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
2e780 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
2e790 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
2e7a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2e7b0 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
2e7c0 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2e7d0 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
2e7e0 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
2e7f0 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31  ells];.  aSpace1
2e800 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b   = (u8*)&szCell[
2e810 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73  nMaxCells];.  as
2e820 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
2e830 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63  _ALIGNMENT(aSpac
2e840 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  e1) );..  /*.  *
2e850 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
2e860 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
2e870 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
2e880 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
2e890 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
2e8a0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
2e8b0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
2e8c0 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
2e8d0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
2e8e0 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
2e8f0 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b  ed from aSpace1[
2e900 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
2e910 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
2e920 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
2e930 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
2e940 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
2e950 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
2e960 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
2e970 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
2e980 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
2e990 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
2e9a0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
2e9b0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
2e9c0 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
2e9d0 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
2e9e0 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
2e9f0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
2ea00 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
2ea10 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
2ea20 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
2ea30 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
2ea40 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
2ea50 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
2ea60 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
2ea70 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
2ea80 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
2ea90 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
2eaa0 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
2eab0 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
2eac0 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
2ead0 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
2eae0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
2eaf0 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
2eb00 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
2eb10 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
2eb20 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
2eb30 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
2eb40 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72  ..  */.  leafCor
2eb50 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b  rection = apOld[
2eb60 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  0]->leaf*4;.  le
2eb70 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30  afData = apOld[0
2eb80 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f  ]->hasData;.  fo
2eb90 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
2eba0 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d  ++){.    int lim
2ebb0 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20  it;.    .    /* 
2ebc0 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
2ebd0 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65  thing else, take
2ebe0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
2ebf0 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62  'th original sib
2ec00 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20  ling.    ** The 
2ec10 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e  rest of this fun
2ec20 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64  ction will use d
2ec30 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70  ata from the cop
2ec40 69 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a  ies rather.    *
2ec50 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  * that the origi
2ec60 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20  nal pages since 
2ec70 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
2ec80 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68  es will be in th
2ec90 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73  e.    ** process
2eca0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
2ecb0 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d  itten.  */.    M
2ecc0 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61  emPage *pOld = a
2ecd0 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
2ece0 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42  age*)&aSpace1[pB
2ecf0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a  t->pageSize + k*
2ed00 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  i];.    memcpy(p
2ed10 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  Old, apOld[i], s
2ed20 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
2ed30 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61  .    pOld->aData
2ed40 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b   = (void*)&pOld[
2ed50 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
2ed60 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c  Old->aData, apOl
2ed70 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74  d[i]->aData, pBt
2ed80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20  ->pageSize);..  
2ed90 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e    limit = pOld->
2eda0 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65  nCell+pOld->nOve
2edb0 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a  rflow;.    for(j
2edc0 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b  =0; j<limit; j++
2edd0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ede0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
2edf0 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c   );.      apCell
2ee00 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76  [nCell] = findOv
2ee10 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c  erflowCell(pOld,
2ee20 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c   j);.      szCel
2ee30 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53  l[nCell] = cellS
2ee40 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43  izePtr(pOld, apC
2ee50 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20  ell[nCell]);.   
2ee60 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20     nCell++;.    
2ee70 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64  }.    if( i<nOld
2ee80 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29  -1 && !leafData)
2ee90 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d  {.      u16 sz =
2eea0 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a   (u16)szNew[i];.
2eeb0 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
2eec0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
2eed0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
2eee0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2eef0 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20  Cell] = sz;.    
2ef00 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
2ef10 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
2ef20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a     iSpace1 += sz
2ef30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2ef40 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
2ef50 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
2ef60 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42  ert( iSpace1<=pB
2ef70 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
2ef80 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2ef90 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
2efa0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
2efb0 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65  Cell] = pTemp+le
2efc0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2efd0 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2efe0 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c  Correction==0 ||
2eff0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2f000 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  =4 );.      szCe
2f010 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65  ll[nCell] = szCe
2f020 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66  ll[nCell] - leaf
2f030 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
2f040 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61    if( !pOld->lea
2f050 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  f ){.        ass
2f060 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74  ert( leafCorrect
2f070 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ion==0 );.      
2f080 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e    assert( pOld->
2f090 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a  hdrOffset==0 );.
2f0a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2f0b0 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20  ight pointer of 
2f0c0 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70  the child page p
2f0d0 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20  Old becomes the 
2f0e0 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  left.        ** 
2f0f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64  pointer of the d
2f100 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20  ivider cell */. 
2f110 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70         memcpy(ap
2f120 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f  Cell[nCell], &pO
2f130 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29  ld->aData[8], 4)
2f140 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f150 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2f160 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2f170 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2f180 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
2f190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2f1a0 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
2f1b0 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
2f1c0 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
2f1d0 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2f1e0 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20  [nCell] = 4;.   
2f1f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2f200 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2f210 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
2f220 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
2f230 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
2f240 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
2f250 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
2f260 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
2f270 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
2f280 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
2f290 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
2f2a0 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
2f2b0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
2f2c0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
2f2d0 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
2f2e0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
2f2f0 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
2f300 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
2f310 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
2f320 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
2f330 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
2f340 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
2f350 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
2f360 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
2f370 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
2f380 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
2f390 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
2f3a0 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
2f3b0 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
2f3c0 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
2f3d0 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
2f3e0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
2f3f0 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
2f400 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
2f410 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
2f420 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
2f430 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
2f440 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
2f450 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
2f460 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2f470 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
2f480 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
2f490 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
2f4a0 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
2f4b0 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
2f4c0 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
2f4d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
2f4e0 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
2f4f0 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
2f500 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
2f510 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
2f520 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
2f530 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
2f540 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
2f550 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
2f560 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
2f570 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
2f580 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
2f590 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
2f5a0 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
2f5b0 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
2f5c0 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
2f5d0 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
2f5e0 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
2f5f0 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20       if( k>NB+1 
2f600 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  ){ rc = SQLITE_C
2f610 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c  ORRUPT; goto bal
2f620 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a  ance_cleanup; }.
2f630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65      }.  }.  szNe
2f640 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b  w[k] = subtotal;
2f650 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e  .  cntNew[k] = n
2f660 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20  Cell;.  k++;..  
2f670 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b  /*.  ** The pack
2f680 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20  ing computed by 
2f690 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f  the previous blo
2f6a0 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77  ck is biased tow
2f6b0 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ard the siblings
2f6c0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66  .  ** on the lef
2f6d0 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66  t side.  The lef
2f6e0 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61  t siblings are a
2f6f0 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c  lways nearly ful
2f700 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a  l, while the.  *
2f710 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  * right-most sib
2f720 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65  ling might be ne
2f730 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  arly empty.  Thi
2f740 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  s block of code 
2f750 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f  attempts.  ** to
2f760 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b   adjust the pack
2f770 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  ing of siblings 
2f780 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20  to get a better 
2f790 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20  balance..  **.  
2f7a0 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65  ** This adjustme
2f7b0 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  nt is more than 
2f7c0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
2f7d0 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62    The packing ab
2f7e0 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62  ove might.  ** b
2f7f0 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61  e so out of bala
2f800 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c  nce as to be ill
2f810 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70  egal.  For examp
2f820 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  le, the right-mo
2f830 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20  st.  ** sibling 
2f840 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74  might be complet
2f850 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  ely empty.  This
2f860 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e   adjustment is n
2f870 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a  ot optional..  *
2f880 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69  /.  for(i=k-1; i
2f890 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e  >0; i--){.    in
2f8a0 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65  t szRight = szNe
2f8b0 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f  w[i];  /* Size o
2f8c0 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
2f8d0 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e   right */.    in
2f8e0 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77  t szLeft = szNew
2f8f0 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f  [i-1]; /* Size o
2f900 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65  f sibling on the
2f910 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74   left */.    int
2f920 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   r;             
2f930 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
2f940 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20  ht-most cell in 
2f950 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  left sibling */.
2f960 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20      int d;      
2f970 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
2f980 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74   of first cell t
2f990 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69  o the left of ri
2f9a0 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a  ght sibling */..
2f9b0 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69      r = cntNew[i
2f9c0 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d  -1] - 1;.    d =
2f9d0 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74   r + 1 - leafDat
2f9e0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  a;.    assert( d
2f9f0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
2fa00 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78    assert( r<nMax
2fa10 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69  Cells );.    whi
2fa20 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c  le( szRight==0 |
2fa30 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c  | szRight+szCell
2fa40 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73  [d]+2<=szLeft-(s
2fa50 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20  zCell[r]+2) ){. 
2fa60 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20       szRight += 
2fa70 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20  szCell[d] + 2;. 
2fa80 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73       szLeft -= s
2fa90 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20  zCell[r] + 2;.  
2faa0 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d      cntNew[i-1]-
2fab0 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74  -;.      r = cnt
2fac0 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20  New[i-1] - 1;.  
2fad0 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20      d = r + 1 - 
2fae0 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a  leafData;.    }.
2faf0 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73      szNew[i] = s
2fb00 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65  zRight;.    szNe
2fb10 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b  w[i-1] = szLeft;
2fb20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
2fb30 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f  r we found one o
2fb40 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e  r more cells (cn
2fb50 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70  tnew[0])>0) or p
2fb60 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76  Page is.  ** a v
2fb70 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
2fb80 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f  .  A virtual roo
2fb90 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74  t page is when t
2fba0 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a  he real root.  *
2fbb0 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31  * page is page 1
2fbc0 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20   and we are the 
2fbd0 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68  only child of th
2fbe0 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  at page..  */.  
2fbf0 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30  assert( cntNew[0
2fc00 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d  ]>0 || (pParent-
2fc10 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72  >pgno==1 && pPar
2fc20 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29  ent->nCell==0) )
2fc30 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
2fc40 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64  ANCE: old: %d %d
2fc50 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c   %d  ",.    apOl
2fc60 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20  d[0]->pgno, .   
2fc70 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64   nOld>=2 ? apOld
2fc80 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20  [1]->pgno : 0,. 
2fc90 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f     nOld>=3 ? apO
2fca0 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a  ld[2]->pgno : 0.
2fcb0 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a    ));..  /*.  **
2fcc0 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20   Allocate k new 
2fcd0 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c  pages.  Reuse ol
2fce0 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f  d pages where po
2fcf0 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69  ssible..  */.  i
2fd00 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e  f( apOld[0]->pgn
2fd10 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  o<=1 ){.    rc =
2fd20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2fd30 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2fd40 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2fd50 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f   pageFlags = apO
2fd60 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b  ld[0]->aData[0];
2fd70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b  .  for(i=0; i<k;
2fd80 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61   i++){.    MemPa
2fd90 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66  ge *pNew;.    if
2fda0 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20  ( i<nOld ){.    
2fdb0 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69    pNew = apNew[i
2fdc0 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20  ] = apOld[i];.  
2fdd0 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30      apOld[i] = 0
2fde0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2fdf0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2fe00 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  New->pDbPage);. 
2fe10 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
2fe20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2fe30 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2fe40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fe50 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
2fe60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  ;.      rc = all
2fe70 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2fe80 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f  Bt, &pNew, &pgno
2fe90 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  , pgno, 0);.    
2fea0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2feb0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2fec0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
2fed0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
2fee0 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew++;..      /* 
2fef0 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
2ff00 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
2ff10 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2ff20 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ge. */.      if(
2ff30 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
2ff40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2ff50 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65  rmapPut(pBt, pNe
2ff60 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  w->pgno, PTRMAP_
2ff70 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e  BTREE, pParent->
2ff80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
2ff90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ffa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2ffb0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2ffc0 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  up;.        }.  
2ffd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ffe0 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
2fff0 6c 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65  ld pages that we
30000 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73  re not reused as
30010 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f   new pages..  */
30020 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64  .  while( i<nOld
30030 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
30040 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
30050 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
30060 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
30070 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  up;.    releaseP
30080 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
30090 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
300a0 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20  .    i++;.  }.. 
300b0 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65   /*.  ** Put the
300c0 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63   new pages in ac
300d0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
300e0 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20  This helps to.  
300f0 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20  ** keep entries 
30100 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
30110 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61   in order so tha
30120 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66  t a scan.  ** of
30130 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20   the table is a 
30140 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
30150 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54  ugh the file.  T
30160 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e  hat.  ** in turn
30170 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61   helps the opera
30180 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64  ting system to d
30190 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a  eliver pages.  *
301a0 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  * from the disk 
301b0 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20  more rapidly..  
301c0 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32  **.  ** An O(n^2
301d0 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74  ) insertion sort
301e0 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73   algorithm is us
301f0 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20  ed, but since.  
30200 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f  ** n is never mo
30210 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d  re than NB (a sm
30220 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74  all constant), t
30230 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20  hat should.  ** 
30240 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d  not be a problem
30250 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
30260 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65   NB==3, this one
30270 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61   optimization ma
30280 6b 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  kes the database
30290 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20  .  ** about 25% 
302a0 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65  faster for large
302b0 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20   insertions and 
302c0 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  deletions..  */.
302d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31    for(i=0; i<k-1
302e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
302f0 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d  minV = apNew[i]-
30300 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d  >pgno;.    int m
30310 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
30320 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
30330 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e  ){.      if( apN
30340 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73  ew[j]->pgno<(uns
30350 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20  igned)minV ){.  
30360 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a        minI = j;.
30370 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61          minV = a
30380 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20  pNew[j]->pgno;. 
30390 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
303a0 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20   if( minI>i ){. 
303b0 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20       int t;.    
303c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20    MemPage *pT;. 
303d0 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69       t = apNew[i
303e0 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70  ]->pgno;.      p
303f0 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  T = apNew[i];.  
30400 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61      apNew[i] = a
30410 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20  pNew[minI];.    
30420 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20    apNew[minI] = 
30430 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pT;.    }.  }.  
30440 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28  TRACE(("new: %d(
30450 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
30460 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c  ) %d(%d) %d(%d)\
30470 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d  n",.    apNew[0]
30480 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d  ->pgno, szNew[0]
30490 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
304a0 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a  apNew[1]->pgno :
304b0 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a   0, nNew>=2 ? sz
304c0 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  New[1] : 0,.    
304d0 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b  nNew>=3 ? apNew[
304e0 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e  2]->pgno : 0, nN
304f0 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d  ew>=3 ? szNew[2]
30500 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
30510 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67  4 ? apNew[3]->pg
30520 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20  no : 0, nNew>=4 
30530 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a  ? szNew[3] : 0,.
30540 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70      nNew>=5 ? ap
30550 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30  New[4]->pgno : 0
30560 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
30570 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61  w[4] : 0));..  a
30580 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30590 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
305a0 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
305b0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70   );.  put4byte(p
305c0 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65  Right, apNew[nNe
305d0 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20  w-1]->pgno);..  
305e0 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64  /*.  ** Evenly d
305f0 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61  istribute the da
30600 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61  ta in apCell[] a
30610 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61  cross the new pa
30620 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74  ges..  ** Insert
30630 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69   divider cells i
30640 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e  nto pParent as n
30650 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
30660 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d   j = 0;.  for(i=
30670 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
30680 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65  .    /* Assemble
30690 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67   the new sibling
306a0 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65   page. */.    Me
306b0 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70  mPage *pNew = ap
306c0 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  New[i];.    asse
306d0 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( j<nMaxCells 
306e0 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  );.    zeroPage(
306f0 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
30700 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61  ;.    assemblePa
30710 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b  ge(pNew, cntNew[
30720 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d  i]-j, &apCell[j]
30730 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20  , &szCell[j]);. 
30740 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
30750 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65  >nCell>0 || (nNe
30760 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30  w==1 && cntNew[0
30770 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73  ]==0) );.    ass
30780 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72  ert( pNew->nOver
30790 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  flow==0 );..    
307a0 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
307b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
307c0 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
307d0 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
307e0 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
307f0 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
30800 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
30810 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
30820 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
30830 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
30840 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d   i<nNew-1 || j==
30850 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28  nCell );.    if(
30860 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20   j<nCell ){.    
30870 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20    u8 *pCell;.   
30880 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
30890 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20      int sz;..   
308a0 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61     assert( j<nMa
308b0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
308c0 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a  pCell = apCell[j
308d0 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a  ];.      sz = sz
308e0 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f  Cell[j] + leafCo
308f0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20  rrection;.      
30900 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70  pTemp = &aOvflSp
30910 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b  ace[iOvflSpace];
30920 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
30930 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
30940 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
30950 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
30960 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
30970 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
30980 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
30990 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
309a0 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
309b0 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
309c0 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
309d0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
309e0 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
309f0 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
30a00 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
30a10 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
30a20 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
30a30 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
30a40 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
30a50 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
30a60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
30a70 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
30a80 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
30a90 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
30aa0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
30ab0 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
30ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
30ad0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
30ae0 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
30af0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
30b00 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
30b10 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20  .        sz = 4 
30b20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  + putVarint(&pCe
30b30 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll[4], info.nKey
30b40 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70  );.        pTemp
30b50 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
30b60 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e{.        pCell
30b70 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f   -= 4;.        /
30b80 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66  * Obscure case f
30b90 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61  or non-leaf-data
30ba0 20 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63   trees: If the c
30bb0 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73  ell at pCell was
30bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
30bd0 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e  iously stored on
30be0 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e   a leaf node, an
30bf0 64 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73  d its reported s
30c00 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20  ize was 4.      
30c10 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e    ** bytes, then
30c20 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79   it may actually
30c30 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
30c40 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a   this .        *
30c50 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74  * (see sqlite3Bt
30c60 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
30c70 29 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68  ), 4 bytes is th
30c80 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f  e minimum size o
30c90 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79  f.        ** any
30ca0 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69   cell). But it i
30cb0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
30cc0 61 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  ass the correct 
30cd0 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20  size to .       
30ce0 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29   ** insertCell()
30cf0 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65  , so reparse the
30d00 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20   cell now..     
30d10 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
30d20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
30d30 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e  can never happen
30d40 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
30d50 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a  ta file, as all.
30d60 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73          ** cells
30d70 20 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20   are at least 4 
30d80 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68  bytes. It only h
30d90 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65  appens in b-tree
30da0 73 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  s used.        *
30db0 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49  * to evaluate "I
30dc0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20  N (SELECT ...)" 
30dd0 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75  and similar clau
30de0 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ses..        */.
30df0 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65          if( szCe
30e00 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20  ll[j]==4 ){.    
30e10 20 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61        assert(lea
30e20 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b  fCorrection==4);
30e30 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
30e40 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
30e50 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  ent, pCell);.   
30e60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30e70 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20       iOvflSpace 
30e80 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73  += sz;.      ass
30e90 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61  ert( sz<=pBt->pa
30ea0 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20  geSize/4 );.    
30eb0 20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53    assert( iOvflS
30ec0 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  pace<=pBt->pageS
30ed0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ize );.      rc 
30ee0 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
30ef0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65  rent, nxDiv, pCe
30f00 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70  ll, sz, pTemp, p
30f10 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
30f20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30f30 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
30f40 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
30f50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
30f60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
30f70 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
30f80 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b  ge) );..      j+
30f90 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
30fa0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
30fb0 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29  sert( j==nCell )
30fc0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64  ;.  assert( nOld
30fd0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
30fe0 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20  nNew>0 );.  if( 
30ff0 28 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46  (pageFlags & PTF
31000 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20  _LEAF)==0 ){.   
31010 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61   u8 *zChild = &a
31020 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61  pCopy[nOld-1]->a
31030 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d  Data[8];.    mem
31040 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d  cpy(&apNew[nNew-
31050 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43  1]->aData[8], zC
31060 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20  hild, 4);.  }.. 
31070 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70   if( isRoot && p
31080 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
31090 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72   && pParent->hdr
310a0 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d  Offset<=apNew[0]
310b0 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f  ->nFree ){.    /
310c0 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20  * The root page 
310d0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f  of the b-tree no
310e0 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  w contains no ce
310f0 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69  lls. The only si
31100 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67  bling.    ** pag
31110 65 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  e is the right-c
31120 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  hild of the pare
31130 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e  nt. Copy the con
31140 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20  tents of the.   
31150 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69   ** child page i
31160 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20  nto the parent, 
31170 64 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f  decreasing the o
31180 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66  verall height of
31190 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72   the.    ** b-tr
311a0 65 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20  ee structure by 
311b0 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73  one. This is des
311c0 63 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62  cribed as the "b
311d0 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72  alance-shallower
311e0 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67  ".    ** sub-alg
311f0 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64  orithm in some d
31200 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20  ocumentation..  
31210 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
31220 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  his is an auto-v
31230 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20  acuum database, 
31240 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79  the call to copy
31250 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20  NodeContent() . 
31260 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70     ** sets all p
31270 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
31280 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  es corresponding
31290 20 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61   to database ima
312a0 67 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a  ge pages .    **
312b0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70   for which the p
312c0 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64  ointer is stored
312d0 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74   within the cont
312e0 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64  ent being copied
312f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
31300 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72  The second asser
31310 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  t below verifies
31320 20 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20   that the child 
31330 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
31340 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20  nted.    ** (it 
31350 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77  must be, as it w
31360 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72  as just reconstr
31370 75 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65  ucted using asse
31380 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69  mblePage()). Thi
31390 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f  s.    ** is impo
313a0 72 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72  rtant if the par
313b0 65 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73  ent page happens
313c0 20 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66   to be page 1 of
313d0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
313e0 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a    ** image.  */.
313f0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77      assert( nNew
31400 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==1 );.    asser
31410 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72  t( apNew[0]->nFr
31420 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28  ee == .        (
31430 67 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b  get2byte(&apNew[
31440 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70  0]->aData[5])-ap
31450 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73  New[0]->cellOffs
31460 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65  et-apNew[0]->nCe
31470 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20  ll*2) .    );.  
31480 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
31490 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43  =(rc = copyNodeC
314a0 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c  ontent(apNew[0],
314b0 20 70 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20   pParent)) ){.  
314c0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
314d0 65 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20  e(apNew[0]);.   
314e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49   }.  }else if( I
314f0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
31500 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f     /* Fix the po
31510 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
31520 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65  s for all the ce
31530 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68  lls that were sh
31540 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20  ifted around. . 
31550 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20     ** There are 
31560 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
31570 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74  t types of point
31580 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74  er-map entries t
31590 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  hat need to.    
315a0 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68  ** be dealt with
315b0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
315c0 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20  . Some of these 
315d0 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c  have been set al
315e0 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a  ready, but.    *
315f0 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e  * many have not.
31600 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
31610 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20  s a summary:.   
31620 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20   **.    **   1) 
31630 54 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f  The entries asso
31640 63 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20  ciated with new 
31650 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68  sibling pages th
31660 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20  at were not.    
31670 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73  **      siblings
31680 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
31690 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20  ion was called. 
316a0 54 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61  These have alrea
316b0 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62  dy.    **      b
316c0 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27  een set. We don'
316d0 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20  t need to worry 
316e0 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e  about old siblin
316f0 67 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20  gs that were.   
31700 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74   **      moved t
31710 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  o the free-list 
31720 2d 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29  - the freePage()
31730 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20   code has taken 
31740 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  care.    **     
31750 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a   of those..    *
31760 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68  *.    **   2) Th
31770 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
31780 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64  tries associated
31790 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
317a0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20  overflow.    ** 
317b0 20 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79       page in any
317c0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73   overflow chains
317d0 20 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76   used by new div
317e0 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73  ider cells. Thes
317f0 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68  e .    **      h
31800 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79  ave also already
31810 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
31820 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72   of by the inser
31830 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20  tCell() code..  
31840 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29    **.    **   3)
31850 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20   If the sibling 
31860 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65  pages are not le
31870 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  aves, then the c
31880 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20  hild pages of.  
31890 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20    **      cells 
318a0 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69  stored on the si
318b0 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20  bling pages may 
318c0 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74  need to be updat
318d0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
318e0 2a 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69  *   4) If the si
318f0 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  bling pages are 
31900 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74  not internal int
31910 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20  key nodes, then 
31920 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  any.    **      
31930 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75  overflow pages u
31940 73 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c  sed by these cel
31950 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  ls may need to b
31960 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a  e updated.    **
31970 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20        (internal 
31980 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76  intkey nodes nev
31990 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  er contain point
319a0 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  ers to overflow 
319b0 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20  pages)..    **. 
319c0 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68     **   5) If th
319d0 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  e sibling pages 
319e0 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
319f0 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  then the pointer
31a00 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20  -map.    **     
31a10 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
31a20 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67   right-child pag
31a30 65 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69  es of each sibli
31a40 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20  ng may need.    
31a50 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70  **      to be up
31a60 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  dated..    **.  
31a70 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64    ** Cases 1 and
31a80 20 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74   2 are dealt wit
31a90 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72  h above by other
31aa0 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a   code. The next.
31ab0 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61      ** block dea
31ac0 6c 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20  ls with cases 3 
31ad0 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e  and 4 and the on
31ae0 65 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61  e after that, ca
31af0 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20  se 5. Since.    
31b00 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69  ** setting a poi
31b10 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69  nter map entry i
31b20 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65  s a relatively e
31b30 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
31b40 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  on, this.    ** 
31b50 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70  code only sets p
31b60 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
31b70 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20  es for child or 
31b80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74  overflow pages t
31b90 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20  hat have.    ** 
31ba0 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62  actually moved b
31bb0 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a  etween pages.  *
31bc0 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  /.    MemPage *p
31bd0 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a  New = apNew[0];.
31be0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c      MemPage *pOl
31bf0 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20  d = apCopy[0];. 
31c00 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77     int nOverflow
31c10 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   = pOld->nOverfl
31c20 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78  ow;.    int iNex
31c30 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  tOld = pOld->nCe
31c40 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a  ll + nOverflow;.
31c50 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f      int iOverflo
31c60 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f  w = (nOverflow ?
31c70 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
31c80 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a  idx : -1);.    j
31c90 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cb0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c    /* Current 'ol
31cc0 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  d' sibling page 
31cd0 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20  */.    k = 0;   
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
31d00 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69  rent 'new' sibli
31d10 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66  ng page */.    f
31d20 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20  or(i=0; i<nCell 
31d30 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
31d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
31d50 74 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b  t isDivider = 0;
31d60 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d  .      while( i=
31d70 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20  =iNextOld ){.   
31d80 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69       /* Cell i i
31d90 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64  s the cell immed
31da0 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
31db0 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f   the last cell o
31dc0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a  n old.        **
31dd0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e   sibling page j.
31de0 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
31df0 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61   are not leaf pa
31e00 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20  ges of an.      
31e10 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72    ** intkey b-tr
31e20 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20  ee, then cell i 
31e30 77 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65  was a divider ce
31e40 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  ll. */.        p
31e50 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a  Old = apCopy[++j
31e60 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74  ];.        iNext
31e70 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44  Old = i + !leafD
31e80 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c  ata + pOld->nCel
31e90 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  l + pOld->nOverf
31ea0 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28  low;.        if(
31eb0 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
31ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f   ){.          nO
31ed0 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e  verflow = pOld->
31ee0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20  nOverflow;.     
31ef0 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d       iOverflow =
31f00 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b   i + !leafData +
31f10 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e   pOld->aOvfl[0].
31f20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  idx;.        }. 
31f30 20 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72         isDivider
31f40 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a   = !leafData;  .
31f50 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
31f60 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e  ssert(nOverflow>
31f70 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69  0 || iOverflow<i
31f80 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
31f90 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20  (nOverflow<2 || 
31fa0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
31fb0 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  dx==pOld->aOvfl[
31fc0 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20  1].idx-1);.     
31fd0 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
31fe0 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76  w<3 || pOld->aOv
31ff0 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d  fl[1].idx==pOld-
32000 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29  >aOvfl[2].idx-1)
32010 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69  ;.      if( i==i
32020 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
32030 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
32040 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  1;.        if( (
32050 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29  --nOverflow)>0 )
32060 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65  {.          iOve
32070 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20  rflow++;.       
32080 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
32090 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b    if( i==cntNew[
320a0 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  k] ){.        /*
320b0 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63   Cell i is the c
320c0 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ell immediately 
320d0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61  following the la
320e0 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20  st cell on new. 
320f0 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e         ** siblin
32100 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65  g page k. If the
32110 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f   siblings are no
32120 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20  t leaf pages of 
32130 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  an.        ** in
32140 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65  tkey b-tree, the
32150 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69  n cell i is a di
32160 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a  vider cell.  */.
32170 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61          pNew = a
32180 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20  pNew[++k];.     
32190 20 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61     if( !leafData
321a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
321b0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
321c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
321d0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
321e0 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20  ( j<nOld );.    
321f0 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77    assert( k<nNew
32200 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
32210 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72   the cell was or
32220 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72  iginally divider
32230 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f   cell (and is no
32240 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20  t now) or.      
32250 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  ** an overflow c
32260 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ell, or if the c
32270 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ell was located 
32280 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  on a different s
32290 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ibling.      ** 
322a0 70 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20  page before the 
322b0 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20  balancing, then 
322c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
322d0 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
322e0 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68  ed.      ** with
322f0 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76   any child or ov
32300 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65  erflow pages nee
32310 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
32320 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69    */.      if( i
32330 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64  sDivider || pOld
32340 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
32350 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  no ){.        if
32360 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ( !leafCorrectio
32370 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  n ){.          r
32380 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
32390 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
323a0 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[i]), PTRMAP_B
323b0 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
323c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
323d0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
323e0 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61  i]>pNew->minLoca
323f0 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l && rc==SQLITE_
32400 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32410 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
32420 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65  flPtr(pNew, apCe
32430 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
32440 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
32450 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f  .    if( !leafCo
32460 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  rrection ){.    
32470 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
32480 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e  QLITE_OK && i<nN
32490 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ew; i++){.      
324a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
324b0 28 0a 09 20 20 20 20 70 42 74 2c 20 67 65 74 34  (..    pBt, get4
324c0 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e  byte(&apNew[i]->
324d0 61 44 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41  aData[8]), PTRMA
324e0 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69  P_BTREE, apNew[i
324f0 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ]->pgno);.      
32500 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20  }.    }..#if 0. 
32510 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70     /* The ptrmap
32520 43 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e  CheckPages() con
32530 74 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73  tains assert() s
32540 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76  tatements that v
32550 65 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a  erify that.    *
32560 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61  * all pointer ma
32570 70 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20  p pages are set 
32580 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20  correctly. This 
32590 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65  is helpful while
325a0 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69   .    ** debuggi
325b0 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61  ng. This is usua
325c0 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63  lly disabled bec
325d0 61 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64  ause a corrupt d
325e0 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20  atabase may.    
325f0 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65  ** cause an asse
32600 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74  rt() statement t
32610 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20  o fail.  */.    
32620 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32630 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20  (apNew, nNew);. 
32640 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61     ptrmapCheckPa
32650 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29  ges(&pParent, 1)
32660 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
32670 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
32680 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41  >isInit );.  TRA
32690 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69  CE(("BALANCE: fi
326a0 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e  nished: old=%d n
326b0 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e  ew=%d cells=%d\n
326c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c  ",.          nOl
326d0 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
326e0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65  ;..  /*.  ** Cle
326f0 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
32700 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
32710 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
32720 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
32730 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72  e(apCell);.  for
32740 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
32750 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  +){.    releaseP
32760 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20  age(apOld[i]);. 
32770 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
32780 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
32790 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65  releasePage(apNe
327a0 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  w[i]);.  }..  re
327b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
327c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
327d0 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
327e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
327f0 20 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74   a b-tree struct
32800 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75  ure is.** overfu
32810 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d  ll (has one or m
32820 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
32830 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  es)..**.** A new
32840 20 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61   child page is a
32850 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65  llocated and the
32860 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
32870 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a   current root.**
32880 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67   page, including
32890 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c   overflow cells,
328a0 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f   are copied into
328b0 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20   the child. The 
328c0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20  root.** page is 
328d0 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e  then overwritten
328e0 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65   to make it an e
328f0 6d 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74  mpty page with t
32900 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a  he right-child .
32910 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ** pointer point
32920 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70  ing to the new p
32930 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  age..**.** Befor
32940 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c  e returning, all
32950 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32960 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
32970 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20  ng to pages .** 
32980 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69  that the new chi
32990 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74  ld-page now cont
329a0 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f  ains pointers to
329b0 20 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68   are updated. Th
329c0 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65  e.** entry corre
329d0 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
329e0 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20  new right-child 
329f0 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72  pointer of the r
32a00 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  oot.** page is a
32a10 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a  lso updated..**.
32a20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
32a30 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65  , *ppChild is se
32a40 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72  t to contain a r
32a50 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
32a60 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61  child .** page a
32a70 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  nd SQLITE_OK is 
32a80 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
32a90 73 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65  s case the calle
32aa0 72 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a  r is required.**
32ab0 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
32ac0 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69  Page() on *ppChi
32ad0 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e  ld exactly once.
32ae0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32af0 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72  urs,.** an error
32b00 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
32b10 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69  d and *ppChild i
32b20 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73  s set to 0..*/.s
32b30 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
32b40 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65  e_deeper(MemPage
32b50 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65   *pRoot, MemPage
32b60 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69   **ppChild){.  i
32b70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32b90 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   Return value fr
32ba0 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73  om subprocedures
32bb0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
32bc0 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Child = 0;      
32bd0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
32be0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
32bf0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
32c00 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20  noChild;        
32c10 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
32c20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
32c30 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a  w child page */.
32c40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
32c50 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20  = pRoot->pBt;   
32c60 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f   /* The BTree */
32c70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ..  assert( pRoo
32c80 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  t->nOverflow>0 )
32c90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
32ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32cb0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
32cc0 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20   /* Make pRoot, 
32cd0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
32ce0 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69   the b-tree, wri
32cf0 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20  table. Allocate 
32d00 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65  a new .  ** page
32d10 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
32d20 65 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d  e the new right-
32d30 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20  child of pPage. 
32d40 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  Copy the content
32d50 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f  s.  ** of the no
32d60 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f  de stored on pRo
32d70 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  ot into the new 
32d80 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f  child page..  */
32d90 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
32da0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
32db0 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
32dc0 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c  >pDbPage)).   ||
32dd0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
32de0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
32df0 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c  age(pBt,&pChild,
32e00 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74  &pgnoChild,pRoot
32e10 2d 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c  ->pgno,0)).   ||
32e20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
32e30 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e  = copyNodeConten
32e40 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29  t(pRoot, pChild)
32e50 29 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56  ).   || (ISAUTOV
32e60 41 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20  ACUUM && .      
32e70 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
32e80 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
32e90 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d   pgnoChild, PTRM
32ea0 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d  AP_BTREE, pRoot-
32eb0 3e 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20  >pgno))).  ){.  
32ec0 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a    *ppChild = 0;.
32ed0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
32ee0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74  pChild);.    ret
32ef0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
32f00 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
32f10 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
32f20 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
32f30 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
32f40 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
32f50 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
32f60 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
32f70 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d   pChild->nCell==
32f80 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pRoot->nCell );.
32f90 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
32fa0 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
32fb0 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f   into %d\n", pRo
32fc0 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ot->pgno, pChild
32fd0 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20  ->pgno));..  /* 
32fe0 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f  Copy the overflo
32ff0 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f  w cells from pRo
33000 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a  ot to pChild */.
33010 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
33020 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61  >aOvfl, pRoot->a
33030 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76  Ovfl, pRoot->nOv
33040 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52  erflow*sizeof(pR
33050 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b  oot->aOvfl[0]));
33060 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  .  pChild->nOver
33070 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f  flow = pRoot->nO
33080 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a  verflow;..  /* Z
33090 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ero the contents
330a0 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20   of pRoot. Then 
330b0 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61  install pChild a
330c0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
330d0 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65  d. */.  zeroPage
330e0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e  (pRoot, pChild->
330f0 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
33100 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
33110 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b  e(&pRoot->aData[
33120 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74  pRoot->hdrOffset
33130 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
33140 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70  ..  *ppChild = p
33150 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20  Child;.  return 
33160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
33170 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61  .** The page tha
33180 74 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79  t pCur currently
33190 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a   points to has j
331a0 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  ust been modifie
331b0 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79  d in.** some way
331c0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
331d0 66 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74  figures out if t
331e0 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  his modification
331f0 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72   means the.** tr
33200 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  ee needs to be b
33210 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20  alanced, and if 
33220 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70  so calls the app
33230 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69  ropriate balanci
33240 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20  ng .** routine. 
33250 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  Balancing routin
33260 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
33270 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a  balance_quick().
33280 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65  **   balance_dee
33290 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e  per().**   balan
332a0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a  ce_nonroot().*/.
332b0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
332c0 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
332d0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
332e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73  QLITE_OK;.  cons
332f0 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75  t int nMin = pCu
33300 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  r->pBt->usableSi
33310 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38  ze * 2 / 3;.  u8
33320 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33330 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70  ace[13];.  u8 *p
33340 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53  Free = 0;..  TES
33350 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e  TONLY( int balan
33360 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20  ce_quick_called 
33370 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c  = 0 );.  TESTONL
33380 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  Y( int balance_d
33390 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30  eeper_called = 0
333a0 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20   );..  do {.    
333b0 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72  int iPage = pCur
333c0 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d  ->iPage;.    Mem
333d0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
333e0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
333f0 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67  ];..    if( iPag
33400 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  e==0 ){.      if
33410 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
33420 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ow ){.        /*
33430 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
33440 66 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20  f the b-tree is 
33450 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69  overfull. In thi
33460 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a  s case call the.
33470 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e          ** balan
33480 63 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63  ce_deeper() func
33490 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
334a0 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74   new child for t
334b0 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  he root-page.   
334c0 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79       ** and copy
334d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
334e0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f  tents of the roo
334f0 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68  t-page to it. Th
33500 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78  e.        ** nex
33510 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
33520 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20  he do-loop will 
33530 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c  balance the chil
33540 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20  d page..        
33550 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65  */ .        asse
33560 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  rt( (balance_dee
33570 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  per_called++)==0
33580 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
33590 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28   balance_deeper(
335a0 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70  pPage, &pCur->ap
335b0 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20  Page[1]);.      
335c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
335d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
335e0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31   pCur->iPage = 1
335f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
33600 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
33610 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
33620 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20  aiIdx[1] = 0;.  
33630 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
33640 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d  pCur->apPage[1]-
33650 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
33660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
33670 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65  lse{.        bre
33680 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
33690 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d  }else if( pPage-
336a0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
336b0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e   pPage->nFree<=n
336c0 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65  Min ){.      bre
336d0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
336e0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63       MemPage * c
336f0 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70  onst pParent = p
33700 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
33710 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  e-1];.      int 
33720 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75  const iIdx = pCu
33730 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31  r->aiIdx[iPage-1
33740 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ];..      rc = s
33750 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33760 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
33770 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33780 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23  ==SQLITE_OK ){.#
33790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
337a0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
337b0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
337c0 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20  e->hasData.     
337d0 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f      && pPage->nO
337e0 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20  verflow==1.     
337f0 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f      && pPage->aO
33800 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67  vfl[0].idx==pPag
33810 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20  e->nCell.       
33820 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67    && pParent->pg
33830 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26  no!=1.         &
33840 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  & pParent->nCell
33850 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29  ==iIdx.        )
33860 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  {.          /* C
33870 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  all balance_quic
33880 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20  k() to create a 
33890 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70  new sibling of p
338a0 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20  Page on which.  
338b0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74          ** to st
338c0 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ore the overflow
338d0 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71   cell. balance_q
338e0 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61  uick() inserts a
338f0 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20   new cell.      
33900 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72      ** into pPar
33910 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
33920 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65  ause pParent ove
33930 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20  rflow. If this. 
33940 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70           ** happ
33950 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e  ens, the next in
33960 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
33970 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
33980 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20  ance pParent .  
33990 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65          ** use e
339a0 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f  ither balance_no
339b0 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e  nroot() or balan
339c0 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74  ce_deeper(). Unt
339d0 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20  il this.        
339e0 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68    ** happens, th
339f0 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  e overflow cell 
33a00 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
33a10 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33a20 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20  ace[].          
33a30 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  ** buffer. .    
33a40 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
33a50 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73     ** The purpos
33a60 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
33a70 6e 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74  ng assert() is t
33a80 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c  o check that onl
33a90 79 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  y a.          **
33aa0 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20   single call to 
33ab0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
33ac0 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68  is made for each
33ad0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20   call to this.  
33ae0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74          ** funct
33af0 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72  ion. If this wer
33b00 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20  e not verified, 
33b10 61 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76  a subtle bug inv
33b20 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20  olving reuse.   
33b30 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65         ** of the
33b40 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33b50 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61  ace[] might snea
33b60 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20  k in..          
33b70 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
33b80 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75  ert( (balance_qu
33b90 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30  ick_called++)==0
33ba0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
33bb0 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b   = balance_quick
33bc0 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c  (pParent, pPage,
33bd0 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70   aBalanceQuickSp
33be0 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ace);.        }e
33bf0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
33c00 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f     {.          /
33c10 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
33c20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  call balance_non
33c30 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74  root() to redist
33c40 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20  ribute cells.   
33c50 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
33c60 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  n pPage and up t
33c70 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69  o 2 of its sibli
33c80 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69  ng pages. This i
33c90 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20  nvolves.        
33ca0 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74    ** modifying t
33cb0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  he contents of p
33cc0 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61  Parent, which ma
33cd0 79 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20  y cause pParent 
33ce0 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  to.          ** 
33cf0 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
33d00 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68  or underfull. Th
33d10 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
33d20 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a   of the do-loop.
33d30 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c            ** wil
33d40 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61  l balance the pa
33d50 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72  rent page to cor
33d60 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20  rect this..     
33d70 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20       ** .       
33d80 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72     ** If the par
33d90 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ent page becomes
33da0 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f   overfull, the o
33db0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20  verflow cell or 
33dc0 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20  cells.          
33dd0 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e  ** are stored in
33de0 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66   the pSpace buff
33df0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d  er allocated imm
33e00 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20  ediately below. 
33e10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20  .          ** A 
33e20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61  subsequent itera
33e30 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c  tion of the do-l
33e40 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69  oop will deal wi
33e50 74 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  th this by.     
33e60 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20       ** calling 
33e70 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33e80 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  ) (balance_deepe
33e90 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  r() may be calle
33ea0 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20  d first,.       
33eb0 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65     ** but it doe
33ec0 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f  sn't deal with o
33ed0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20  verflow cells - 
33ee0 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20  just moves them 
33ef0 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  to a.          *
33f00 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  * different page
33f10 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62  ). Once this sub
33f20 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20  sequent call to 
33f30 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33f40 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ) .          ** 
33f50 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69  has completed, i
33f60 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c  t is safe to rel
33f70 65 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20  ease the pSpace 
33f80 62 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20  buffer used by. 
33f90 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
33fa0 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61  previous call, a
33fb0 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  s the overflow c
33fc0 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61  ell data will ha
33fd0 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  ve been .       
33fe0 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74     ** copied eit
33ff0 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  her into the bod
34000 79 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  y of a database 
34010 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65  page or into the
34020 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a   new.          *
34030 2a 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  * pSpace buffer 
34040 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61  passed to the la
34050 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c  tter call to bal
34060 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a  ance_nonroot()..
34070 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
34080 20 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63         u8 *pSpac
34090 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
340a0 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d  alloc(pCur->pBt-
340b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
340c0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
340d0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65  ce_nonroot(pPare
340e0 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65  nt, iIdx, pSpace
340f0 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20  , iPage==1);.   
34100 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65         if( pFree
34110 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34120 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e  /* If pFree is n
34130 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e  ot NULL, it poin
34140 74 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65  ts to the pSpace
34150 20 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20   buffer used .  
34160 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20            ** by 
34170 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20  a previous call 
34180 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  to balance_nonro
34190 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e  ot(). Its conten
341a0 74 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20  ts are.         
341b0 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64     ** now stored
341c0 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20   either on real 
341d0 64 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f  database pages o
341e0 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20  r within the .  
341f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77            ** new
34200 20 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20   pSpace buffer, 
34210 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66  so it may be saf
34220 65 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20  ely freed here. 
34230 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  */.            s
34240 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
34250 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Free);.         
34260 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
34270 20 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66   The pSpace buff
34280 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64  er will be freed
34290 20 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20   after the next 
342a0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
342b0 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e    ** balance_non
342c0 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20  root(), or just 
342d0 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63  before this func
342e0 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68  tion returns, wh
342f0 69 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20  ichever.        
34300 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74    ** comes first
34310 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  . */.          p
34320 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20  Free = pSpace;. 
34330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34340 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ..      pPage->n
34350 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
34360 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
34370 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
34380 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63  e do-loop balanc
34390 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  es the parent pa
343a0 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c  ge. */.      rel
343b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
343c0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61  .      pCur->iPa
343d0 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  ge--;.    }.  }w
343e0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
343f0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46  _OK );..  if( pF
34400 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ree ){.    sqlit
34410 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65  e3PageFree(pFree
34420 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
34430 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rc;.}.../*.** In
34440 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
34450 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65  d into the BTree
34460 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69  .  The key is gi
34470 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65  ven by (pKey,nKe
34480 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  y).** and the da
34490 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28  ta is given by (
344a0 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54  pData,nData).  T
344b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65  he cursor is use
344c0 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66  d only to.** def
344d0 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74  ine what table t
344e0 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64  he record should
344f0 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74   be inserted int
34500 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a  o.  The cursor.*
34510 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  * is left pointi
34520 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c  ng at a random l
34530 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  ocation..**.** F
34540 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62  or an INTKEY tab
34550 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65  le, only the nKe
34560 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b  y value of the k
34570 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65  ey is used.  pKe
34580 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e  y is.** ignored.
34590 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41    For a ZERODATA
345a0 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74   table, the pDat
345b0 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20  a and nData are 
345c0 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a  both ignored..**
345d0 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52  .** If the seekR
345e0 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20  esult parameter 
345f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
34600 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63  n a successful c
34610 61 6c 6c 20 74 6f 0a 2a 2a 20 4d 6f 76 65 74 6f  all to.** Moveto
34620 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 73 65  Unpacked() to se
34630 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20 74  ek cursor pCur t
34640 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20 68  o (pKey, nKey) h
34650 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
34660 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73 65  en performed. se
34670 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65 20  ekResult is the 
34680 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72 65  search result re
34690 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74 69  turned (a negati
346a0 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66 20  ve.** number if 
346b0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
346c0 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73 20  n entry that is 
346d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70 4b  smaller than (pK
346e0 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a 2a  ey, nKey), or.**
346f0 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75   a positive valu
34700 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73  e if pCur points
34710 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61 74   at an etry that
34720 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
34730 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29  .** (pKey, nKey)
34740 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ). .**.** If the
34750 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72 61   seekResult para
34760 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e  meter is 0, then
34770 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61 79   cursor pCur may
34780 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a 2a   point to any .*
34790 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e 6f  * entry or to no
347a0 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20 49   entry at all. I
347b0 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73  n this case this
347c0 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74 6f   function has to
347d0 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75 72   seek.** the cur
347e0 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20 6e  sor before the n
347f0 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69 6e  ew key can be in
34800 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  serted..*/.int s
34810 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
34820 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
34830 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
34840 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
34850 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
34860 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
34870 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
34880 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
34890 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
348a0 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
348b0 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
348c0 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
348d0 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
348e0 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
348f0 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
34900 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
34910 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
34920 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
34930 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
34940 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
34950 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20 20  pendBias,       
34960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
34970 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
34980 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
34990 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c 74    int seekResult
349a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349b0 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70 72   /* Result of pr
349c0 69 6f 72 20 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  ior MovetoUnpack
349d0 65 64 28 29 20 63 61 6c 6c 20 2a 2f 0a 29 7b 0a  ed() call */.){.
349e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
349f0 6c 6f 63 20 3d 20 73 65 65 6b 52 65 73 75 6c 74  loc = seekResult
34a00 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20  ;.  int szNew;. 
34a10 20 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50   int idx;.  MemP
34a20 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
34a30 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
34a40 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
34a50 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
34a60 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
34a70 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
34a80 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
34a90 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ell = 0;..  asse
34aa0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
34ab0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
34ac0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
34ad0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
34ae0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
34af0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
34b00 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nly );.  assert(
34b10 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b   pCur->wrFlag );
34b20 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
34b30 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
34b40 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  ck(p, pCur->pgno
34b50 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65 79  Root, pCur->pKey
34b60 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a 0a  Info!=0, 2) );..
34b70 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
34b80 61 6e 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 61  an insert into a
34b90 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 69   table b-tree, i
34ba0 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 69 6e  nvalidate any in
34bb0 63 72 62 6c 6f 62 20 0a 20 20 2a 2a 20 63 75 72  crblob .  ** cur
34bc0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  sors open on the
34bd0 20 72 6f 77 20 62 65 69 6e 67 20 72 65 70 6c 61   row being repla
34be0 63 65 64 20 28 61 73 73 75 6d 69 6e 67 20 74 68  ced (assuming th
34bf0 69 73 20 69 73 20 61 20 72 65 70 6c 61 63 65 0a  is is a replace.
34c00 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 2d    ** operation -
34c10 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   if it is not, t
34c20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
34c30 61 20 6e 6f 2d 6f 70 29 2e 20 20 2a 2f 0a 20 20  a no-op).  */.  
34c40 69 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  if( pCur->pKeyIn
34c50 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76  fo==0 ){.    inv
34c60 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
34c70 75 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e  ursors(p, pCur->
34c80 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20  pgnoRoot, nKey, 
34c90 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  0);.  }..  if( p
34ca0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34cb0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
34cc0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
34cd0 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  ip;.  }..  /* Sa
34ce0 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
34cf0 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
34d00 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
34d10 69 73 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  is table..  **. 
34d20 20 2a 2a 20 49 6e 20 73 6f 6d 65 20 63 61 73 65   ** In some case
34d30 73 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 62  s, the call to b
34d40 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c  treeMoveto() bel
34d50 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46  ow is a no-op. F
34d60 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c  or.  ** example,
34d70 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20   when inserting 
34d80 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c  data into a tabl
34d90 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65  e with auto-gene
34da0 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20  rated integer.  
34db0 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42  ** keys, the VDB
34dc0 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20  E layer invokes 
34dd0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74  sqlite3BtreeLast
34de0 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
34df0 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67   the .  ** integ
34e00 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49  er key to use. I
34e10 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69  t then calls thi
34e20 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63  s function to ac
34e30 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68  tually insert th
34e40 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74  e .  ** data int
34e50 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54  o the intkey B-T
34e60 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
34e70 65 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 29 20  e btreeMoveto() 
34e80 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20 2a 2a 20  recognizes.  ** 
34e90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
34ea0 69 73 20 61 6c 72 65 61 64 79 20 77 68 65 72 65  is already where
34eb0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
34ec0 61 6e 64 20 72 65 74 75 72 6e 73 20 77 69 74 68  and returns with
34ed0 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61  out.  ** doing a
34ee0 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61 76 6f 69  ny work. To avoi
34ef0 64 20 74 68 77 61 72 74 69 6e 67 20 74 68 65 73  d thwarting thes
34f00 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2c  e optimizations,
34f10 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
34f20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 63 6c 65  .  ** not to cle
34f30 61 72 20 74 68 65 20 63 75 72 73 6f 72 20 68 65  ar the cursor he
34f40 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 0a 20  re..  */.  if(. 
34f50 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
34f60 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
34f70 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
34f80 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c  noRoot, pCur)) |
34f90 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20 20 20 53  | (!loc &&.    S
34fa0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
34fb0 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  btreeMoveto(pCur
34fc0 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70  , pKey, nKey, ap
34fd0 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29  pendBias, &loc))
34fe0 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72  .  )){.    retur
34ff0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
35000 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
35010 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
35020 7c 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  | (pCur->eState=
35030 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
35040 26 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50  && loc) );..  pP
35050 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
35060 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
35070 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35080 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
35090 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
350a0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
350b0 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
350c0 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
350d0 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
350e0 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
350f0 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
35100 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
35110 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
35120 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
35130 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
35140 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
35150 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
35160 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35170 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
35180 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
35190 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c  e(pBt);.  newCel
351a0 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
351b0 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c  ce;.  if( newCel
351c0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
351d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
351e0 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
351f0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
35200 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
35210 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
35220 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
35230 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
35240 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
35250 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
35260 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
35270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
35280 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
35290 45 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20  E(pBt) );.  idx 
352a0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
352b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66  ur->iPage];.  if
352c0 28 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  ( loc==0 ){.    
352d0 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61  u16 szOld;.    a
352e0 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65  ssert( idx<pPage
352f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
35300 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
35310 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
35320 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
35330 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  c ){.      goto 
35340 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
35350 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20  }.    oldCell = 
35360 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
35370 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70  idx);.    if( !p
35380 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
35390 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65      memcpy(newCe
353a0 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b  ll, oldCell, 4);
353b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64  .    }.    szOld
353c0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
353d0 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
353e0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
353f0 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c  ll(pPage, oldCel
35400 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
35410 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
35420 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43  ;.    rc = dropC
35430 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20  ell(pPage, idx, 
35440 73 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  szOld);.    if( 
35450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
35460 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  {.      goto end
35470 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20  _insert;.    }. 
35480 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30   }else if( loc<0
35490 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   && pPage->nCell
354a0 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
354b0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ( pPage->leaf );
354c0 0a 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  .    idx = ++pCu
354d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
354e0 50 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Page];.  }else{.
354f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
35500 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
35510 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
35520 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77  (pPage, idx, new
35530 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20  Cell, szNew, 0, 
35540 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  0);.  assert( rc
35550 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
35560 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
35570 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35580 77 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  w>0 );..  /* If 
35590 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  no error has occ
355a0 75 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68  ured and pPage h
355b0 61 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63  as an overflow c
355c0 65 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63  ell, call balanc
355d0 65 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64  e() .  ** to red
355e0 69 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65  istribute the ce
355f0 6c 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74  lls within the t
35600 72 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e  ree. Since balan
35610 63 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20  ce() may move.  
35620 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a  ** the cursor, z
35630 65 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72  ero the BtCursor
35640 2e 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20  .info.nSize and 
35650 42 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b  BtCursor.validNK
35660 65 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  ey.  ** variable
35670 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65  s..  **.  ** Pre
35680 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
35690 66 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20  f SQLite called 
356a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20  moveToRoot() to 
356b0 6d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a  move the cursor.
356c0 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65    ** back to the
356d0 20 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61   root page as ba
356e0 6c 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20  lance() used to 
356f0 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63  invalidate the c
35700 6f 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20  ontents.  ** of 
35710 42 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b  BtCursor.apPage[
35720 5d 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61  ] and BtCursor.a
35730 69 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20  iIdx[]. Instead 
35740 6f 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20  of doing that,. 
35750 20 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73   ** set the curs
35760 6f 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76  or state to "inv
35770 61 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65  alid". This make
35780 73 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20  s common insert 
35790 6f 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20  operations.  ** 
357a0 73 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e  slightly faster.
357b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65  .  **.  ** There
357c0 20 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74   is a subtle but
357d0 20 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d   important optim
357e0 69 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f  ization here too
357f0 2e 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  . When inserting
35800 0a 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72  .  ** multiple r
35810 65 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69  ecords into an i
35820 6e 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69  ntkey b-tree usi
35830 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73  ng a single curs
35840 6f 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20  or (as can.  ** 
35850 68 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f  happen while pro
35860 63 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45  cessing an "INSE
35870 52 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45  RT INTO ... SELE
35880 43 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20  CT" statement), 
35890 69 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e  it.  ** is advan
358a0 74 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65  tageous to leave
358b0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
358c0 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
358d0 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74   entry in.  ** t
358e0 68 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73  he b-tree if pos
358f0 73 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75  sible. If the cu
35900 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
35910 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73  nting to the las
35920 74 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20  t.  ** entry in 
35930 74 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74  the table, and t
35940 68 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65  he next row inse
35950 72 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65  rted has an inte
35960 67 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72  ger key.  ** lar
35970 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
35980 67 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65  gest existing ke
35990 79 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  y, it is possibl
359a0 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a  e to insert the.
359b0 20 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74    ** row without
359c0 20 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72   seeking the cur
359d0 73 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65  sor. This can be
359e0 20 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e   a big performan
359f0 63 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20  ce boost..  */. 
35a00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
35a10 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
35a20 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
35a30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35a40 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65  K && pPage->nOve
35a50 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20  rflow ){.    rc 
35a60 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b  = balance(pCur);
35a70 0a 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61  ..    /* Must ma
35a80 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
35a90 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
35aa0 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
35ab0 61 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20  alance().    ** 
35ac0 66 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20  fails. Internal 
35ad0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63  data structure c
35ae0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72  orruption will r
35af0 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e  esult otherwise.
35b00 20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73   .    ** Also, s
35b10 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  et the cursor st
35b20 61 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20  ate to invalid. 
35b30 54 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43  This stops saveC
35b40 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a  ursorPosition().
35b50 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69      ** from tryi
35b60 6e 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63  ng to save the c
35b70 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
35b80 6f 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20  of the cursor.  
35b90 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  */.    pCur->apP
35ba0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
35bb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
35bc0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
35bd0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
35be0 49 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ID;.  }.  assert
35bf0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
35c00 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
35c10 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e  erflow==0 );..en
35c20 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75  d_insert:.  retu
35c30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35c40 44 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79  Delete the entry
35c50 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
35c60 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
35c70 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
35c80 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
35c90 20 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20   at a arbitrary 
35ca0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  location..*/.int
35cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
35cc0 65 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ete(BtCursor *pC
35cd0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20  ur){.  Btree *p 
35ce0 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
35cf0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
35d00 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  = p->pBt;       
35d10 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63         .  int rc
35d20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35d40 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
35d50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
35d60 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
35d70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
35d80 74 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66  to delete cell f
35d90 72 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rom */.  unsigne
35da0 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20  d char *pCell;  
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35dc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c   Pointer to cell
35dd0 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20   to delete */.  
35de0 69 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20  int iCellIdx;   
35df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e00 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
35e10 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
35e20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65  */.  int iCellDe
35e30 70 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  pth;            
35e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70            /* Dep
35e50 74 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61  th of node conta
35e60 69 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a  ining pCell */ .
35e70 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
35e80 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
35e90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
35ea0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
35eb0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
35ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
35ed0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
35ee0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
35ef0 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74  Flag );.  assert
35f00 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
35f10 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
35f20 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
35f30 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
35f40 32 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  2) );.  assert( 
35f50 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
35f60 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
35f70 6f 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e  oot) );..  if( N
35f80 45 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78  EVER(pCur->aiIdx
35f90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70  [pCur->iPage]>=p
35fa0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
35fb0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29  ->iPage]->nCell)
35fc0 20 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43   .   || NEVER(pC
35fd0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
35fe0 4f 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20  OR_VALID).  ){. 
35ff0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36000 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65  _ERROR;  /* Some
36010 74 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61  thing has gone a
36020 77 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  wry. */.  }..  /
36030 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
36040 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
36050 74 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20  to remove a row 
36060 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74  from a table b-t
36070 72 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69  ree,.  ** invali
36080 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f  date any incrblo
36090 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  b cursors open o
360a0 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
360b0 64 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69  deleted.  */.  i
360c0 66 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  f( pCur->pKeyInf
360d0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61  o==0 ){.    inva
360e0 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
360f0 72 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70  rsors(p, pCur->p
36100 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69  gnoRoot, pCur->i
36110 6e 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  nfo.nKey, 0);.  
36120 7d 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20  }..  iCellDepth 
36130 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
36140 20 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72   iCellIdx = pCur
36150 2d 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70  ->aiIdx[iCellDep
36160 74 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  th];.  pPage = p
36170 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
36180 6c 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c  lDepth];.  pCell
36190 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
361a0 65 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20  e, iCellIdx);.. 
361b0 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
361c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
361d0 6e 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69  ntry to delete i
361e0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67  s not a leaf pag
361f0 65 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  e, move.  ** the
36200 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
36210 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20  argest entry in 
36220 74 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73  the tree that is
36230 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20   smaller than.  
36240 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69  ** the entry bei
36250 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73  ng deleted. This
36260 20 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61   cell will repla
36270 63 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  ce the cell bein
36280 67 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66  g deleted.  ** f
36290 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  rom the internal
362a0 20 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76   node. The 'prev
362b0 69 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75  ious' entry is u
362c0 73 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73  sed for this ins
362d0 74 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tead.  ** of the
362e0 20 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61   'next' entry, a
362f0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  s the previous e
36300 6e 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61  ntry is always a
36310 20 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a   part of the.  *
36320 2a 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65  * sub-tree heade
36330 64 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70  d by the child p
36340 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  age of the cell 
36350 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54  being deleted. T
36360 68 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62  his makes.  ** b
36370 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65  alancing the tre
36380 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  e following the 
36390 64 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e  delete operation
363a0 20 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69   easier.  */.  i
363b0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
363c0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  ){.    int notUs
363d0 65 64 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ed;.    if( SQLI
363e0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
363f0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
36400 73 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  s(pCur, &notUsed
36410 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  )) ){.      retu
36420 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
36430 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
36440 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
36450 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
36460 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
36470 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61  e before.  ** ma
36480 6b 69 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63  king any modific
36490 61 74 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65  ations. Make the
364a0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   page containing
364b0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65   the entry to be
364c0 20 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77   .  ** deleted w
364d0 72 69 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72  ritable. Then fr
364e0 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ee any overflow 
364f0 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64  pages associated
36500 20 77 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20   with the .  ** 
36510 65 6e 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c  entry and finall
36520 79 20 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c  y remove the cel
36530 6c 20 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69  l itself from wi
36540 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20  thin the page.  
36550 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
36560 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c  OK!=(rc = saveAl
36570 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
36580 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
36590 75 72 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54  ur)).   || SQLIT
365a0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
365b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
365c0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20  age->pDbPage)). 
365d0 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
365e0 28 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28  (rc = clearCell(
365f0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 0a 20  pPage, pCell)). 
36600 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
36610 28 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70  (rc = dropCell(p
36620 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20  Page, iCellIdx, 
36630 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
36640 65 2c 20 70 43 65 6c 6c 29 29 29 0a 20 20 29 7b  e, pCell))).  ){
36650 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
36660 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
36670 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61   cell deleted wa
36680 73 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e  s not located on
36690 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68   a leaf page, th
366a0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20  en the cursor.  
366b0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
366c0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
366d0 6c 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e  largest entry in
366e0 20 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65   the sub-tree he
366f0 61 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65  aded.  ** by the
36700 20 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74   child-page of t
36710 68 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73  he cell that was
36720 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72   just deleted fr
36730 6f 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20  om an internal. 
36740 20 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65   ** node. The ce
36750 6c 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66  ll from the leaf
36760 20 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62   node needs to b
36770 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69  e moved to the i
36780 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64  nternal.  ** nod
36790 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65  e to replace the
367a0 20 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20   deleted cell.  
367b0 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  */.  if( !pPage-
367c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d  >leaf ){.    Mem
367d0 50 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43  Page *pLeaf = pC
367e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
367f0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
36800 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f   nCell;.    Pgno
36810 20 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67   n = pCur->apPag
36820 65 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d  e[iCellDepth+1]-
36830 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67  >pgno;.    unsig
36840 6e 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a  ned char *pTmp;.
36850 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
36860 64 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  dCell(pLeaf, pLe
36870 61 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20  af->nCell-1);.  
36880 20 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69    nCell = cellSi
36890 7a 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65  zePtr(pLeaf, pCe
368a0 6c 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ll);.    assert(
368b0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
368c0 74 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  t)>=nCell );..  
368d0 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
368e0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54  ace(pBt);.    pT
368f0 6d 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  mp = pBt->pTmpSp
36900 61 63 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51  ace;..    if( SQ
36910 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
36920 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
36930 28 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29  (pLeaf->pDbPage)
36940 29 20 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  ) .     || SQLIT
36950 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 69 6e 73 65  E_OK!=(rc = inse
36960 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  rtCell(pPage, iC
36970 65 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c  ellIdx, pCell-4,
36980 20 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20   nCell+4, pTmp, 
36990 6e 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49  n)).     || SQLI
369a0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f  TE_OK!=(rc = dro
369b0 70 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65  pCell(pLeaf, pLe
369c0 61 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65  af->nCell-1, nCe
369d0 6c 6c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ll)).    ){.    
369e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
369f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c   }.  }..  /* Bal
36a00 61 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49  ance the tree. I
36a10 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65  f the entry dele
36a20 74 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20  ted was located 
36a30 6f 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a  on a leaf page,.
36a40 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75    ** then the cu
36a50 72 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74  rsor still point
36a60 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
36a70 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
36a80 20 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c   first.  ** call
36a90 20 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65   to balance() re
36aa0 70 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20  pairs the tree, 
36ab0 61 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20  and the if(...) 
36ac0 63 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a  condition is.  *
36ad0 2a 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20  * never true..  
36ae0 2a 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  **.  ** Otherwis
36af0 65 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20  e, if the entry 
36b00 64 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61  deleted was on a
36b10 6e 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20  n internal node 
36b20 70 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  page, then.  ** 
36b30 70 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  pCur is pointing
36b40 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
36b50 65 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63  e from which a c
36b60 65 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ell was removed 
36b70 74 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20  to.  ** replace 
36b80 74 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64  the cell deleted
36b90 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
36ba0 61 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  al node. This is
36bb0 20 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74   slightly.  ** t
36bc0 72 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61  ricky as the lea
36bd0 66 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e  f node may be un
36be0 64 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65  derfull, and the
36bf0 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d   internal node m
36c00 61 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65  ay.  ** be eithe
36c10 72 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66  r under or overf
36c20 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ull. In this cas
36c30 65 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63  e run the balanc
36c40 69 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20  ing algorithm.  
36c50 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e  ** on the leaf n
36c60 6f 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68  ode first. If th
36c70 65 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65  e balance procee
36c80 64 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70  ds far enough up
36c90 20 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74   the.  ** tree t
36ca0 68 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75  hat we can be su
36cb0 72 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62  re that any prob
36cc0 6c 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72  lem in the inter
36cd0 6e 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a  nal node has.  *
36ce0 2a 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64  * been corrected
36cf0 2c 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65  , so be it. Othe
36d00 72 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c  rwise, after bal
36d10 61 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20  ancing the leaf 
36d20 6e 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20  node,.  ** walk 
36d30 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68  the cursor up th
36d40 65 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e  e tree to the in
36d50 74 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20  ternal node and 
36d60 62 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20  balance it as . 
36d70 20 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20   ** well.  */.  
36d80 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
36d90 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
36da0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d  LITE_OK && pCur-
36db0 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74  >iPage>iCellDept
36dc0 68 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  h ){.    while( 
36dd0 70 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c  pCur->iPage>iCel
36de0 6c 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  lDepth ){.      
36df0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
36e00 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
36e10 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a  Page--]);.    }.
36e20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
36e30 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  (pCur);.  }..  i
36e40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36e50 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f   ){.    moveToRo
36e60 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  ot(pCur);.  }.  
36e70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
36e80 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
36e90 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57   BTree table.  W
36ea0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62  rite into *piTab
36eb0 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e  le the page.** n
36ec0 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f  umber for the ro
36ed0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
36ee0 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ew table..**.** 
36ef0 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65  The type of type
36f00 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
36f10 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  y the flags para
36f20 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65  meter.  Only the
36f30 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  .** following va
36f40 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72  lues of flags ar
36f50 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
36f60 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65  se.  Other value
36f70 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d  s for.** flags m
36f80 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a  ight not work:.*
36f90 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49  *.**     BTREE_I
36fa0 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46  NTKEY|BTREE_LEAF
36fb0 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f  DATA     Used fo
36fc0 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74  r SQL tables wit
36fd0 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20  h rowid keys.** 
36fe0 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41      BTREE_ZERODA
36ff0 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TA              
37000 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c      Used for SQL
37010 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74   indices.*/.stat
37020 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61  ic int btreeCrea
37030 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  teTable(Btree *p
37040 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20  , int *piTable, 
37050 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74  int flags){.  Bt
37060 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
37070 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
37080 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70  *pRoot;.  Pgno p
37090 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72  gnoRoot;.  int r
370a0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
370b0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
370c0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
370d0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
370e0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
370f0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
37100 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
37110 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
37120 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
37130 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  UM.  rc = alloca
37140 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
37150 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f   &pRoot, &pgnoRo
37160 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28  ot, 1, 0);.  if(
37170 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
37180 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  n rc;.  }.#else.
37190 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
371a0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
371b0 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20  o pgnoMove;     
371c0 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20   /* Move a page 
371d0 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f  here to make roo
371e0 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70  m for the root-p
371f0 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  age */.    MemPa
37200 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f  ge *pPageMove; /
37210 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f  * The page to mo
37220 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f  ve to. */..    /
37230 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77  * Creating a new
37240 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61   table may proba
37250 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  bly require movi
37260 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64  ng an existing d
37270 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74  atabase.    ** t
37280 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
37290 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72  the new tables r
372a0 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73  oot page. In cas
372b0 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e  e this page turn
372c0 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20  s.    ** out to 
372d0 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
372e0 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20  age, delete all 
372f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61  overflow page-ma
37300 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20  p caches.    ** 
37310 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72  held by open cur
37320 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sors..    */.   
37330 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
37340 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
37350 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
37360 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61  he value of meta
37370 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74  [3] from the dat
37380 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69  abase to determi
37390 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20  ne where the.   
373a0 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66   ** root page of
373b0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73   the new table s
373c0 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33  hould go. meta[3
373d0 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74  ] is the largest
373e0 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
373f0 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72  * created so far
37400 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  , so the new roo
37410 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b  t-page is (meta[
37420 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  3]+1)..    */.  
37430 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
37440 74 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c  tMeta(p, BTREE_L
37450 41 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45  ARGEST_ROOT_PAGE
37460 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
37470 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
37480 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
37490 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
374a0 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
374b0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
374c0 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
374d0 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
374e0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
374f0 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d  while( pgnoRoot=
37500 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
37510 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
37520 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
37530 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
37540 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
37550 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
37560 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
37570 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
37580 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
37590 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
375a0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
375b0 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
375c0 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
375d0 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
375e0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
375f0 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
37600 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
37610 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
37620 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
37630 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
37640 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
37650 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
37660 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
37670 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
37680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37690 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
376a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
376b0 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
376c0 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
376d0 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69     /* pgnoRoot i
376e0 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
376f0 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
37700 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
37710 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  f.      ** the n
37720 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69  ew table (assumi
37730 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  ng an error did 
37740 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20  not occur). But 
37750 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a  we were.      **
37760 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d   allocated pgnoM
37770 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64  ove. If required
37780 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73   (i.e. if it was
37790 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20   not allocated. 
377a0 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e       ** by exten
377b0 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20  ding the file), 
377c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
377d0 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e   at position pgn
377e0 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69  oMove.      ** i
377f0 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61  s already journa
37800 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
37810 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
37820 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
37830 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e;..      releas
37840 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29  ePage(pPageMove)
37850 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ;..      /* Move
37860 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
37870 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  tly at pgnoRoot 
37880 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a  to pgnoMove. */.
37890 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
378a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
378b0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
378c0 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
378d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
378e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
378f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
37900 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
37910 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pGet(pBt, pgnoRo
37920 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  ot, &eType, &iPt
37930 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  rPage);.      if
37940 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
37950 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70  ROOTPAGE || eTyp
37960 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
37970 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  GE ){.        rc
37980 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
37990 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
379a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
379b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
379c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
379d0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
379e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
379f0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
37a00 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
37a10 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
37a20 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
37a30 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
37a40 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  ;.      rc = rel
37a50 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
37a60 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74  Root, eType, iPt
37a70 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c  rPage, pgnoMove,
37a80 20 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61   0);.      relea
37a90 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a  sePage(pRoot);..
37aa0 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20        /* Obtain 
37ab0 74 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f  the page at pgno
37ac0 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  Root */.      if
37ad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37ae0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
37af0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37b10 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
37b20 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f  , pgnoRoot, &pRo
37b30 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ot, 0);.      if
37b40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37b50 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
37b60 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37b70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
37b80 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74  PagerWrite(pRoot
37b90 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
37ba0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37bb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37bc0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
37bd0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37be0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
37c00 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65  Root = pPageMove
37c10 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a  ;.    } ..    /*
37c20 20 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   Update the poin
37c30 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61  ter-map and meta
37c40 2d 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e  -data with the n
37c50 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d  ew root-page num
37c60 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ber. */.    rc =
37c70 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
37c80 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50  pgnoRoot, PTRMAP
37c90 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20  _ROOTPAGE, 0);. 
37ca0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37cb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37cc0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
37cd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
37ce0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
37cf0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c  reeUpdateMeta(p,
37d00 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20   4, pgnoRoot);. 
37d10 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37d20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37d30 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Root);.      ret
37d40 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
37d50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
37d60 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37d70 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20  ge(pBt, &pRoot, 
37d80 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29  &pgnoRoot, 1, 0)
37d90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
37da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65  eturn rc;.  }.#e
37db0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73  ndif.  assert( s
37dc0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37dd0 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44  teable(pRoot->pD
37de0 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f  bPage) );.  zero
37df0 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67  Page(pRoot, flag
37e00 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20  s | PTF_LEAF);. 
37e10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
37e20 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  ef(pRoot->pDbPag
37e30 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d  e);.  *piTable =
37e40 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a   (int)pgnoRoot;.
37e50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37e60 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
37e70 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
37e80 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
37e90 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
37ea0 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
37eb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
37ec0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62  ter(p);.  rc = b
37ed0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
37ee0 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67  p, piTable, flag
37ef0 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  s);.  sqlite3Btr
37f00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
37f10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
37f20 2a 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65  * Erase the give
37f30 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
37f40 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c  and all its chil
37f50 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  dren.  Return.**
37f60 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
37f70 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74   freelist..*/.st
37f80 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61  atic int clearDa
37f90 74 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74  tabasePage(.  Bt
37fa0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
37fb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54         /* The BT
37fc0 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ree that contain
37fd0 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  s the table */. 
37fe0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
37ff0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
38000 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a  umber to clear *
38010 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65  /.  int freePage
38020 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61  Flag,     /* Dea
38030 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20  llocate page if 
38040 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  true */.  int *p
38050 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d  nChange.){.  Mem
38060 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
38070 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
38080 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
38090 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61  l;.  int i;..  a
380a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
380b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
380c0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
380d0 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
380e0 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72  nt(pBt) ){.    r
380f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
38100 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
38110 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
38120 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
38130 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
38140 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64  rc ) goto cleard
38150 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b  atabasepage_out;
38160 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
38170 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
38180 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69  {.    pCell = fi
38190 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
381a0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
381b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
381c0 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61  rc = clearDataba
381d0 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  sePage(pBt, get4
381e0 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20  byte(pCell), 1, 
381f0 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  pnChange);.     
38200 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
38210 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
38220 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
38230 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
38240 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
38250 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
38260 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
38270 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
38280 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
38290 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
382a0 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
382b0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
382c0 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20  ->aData[8]), 1, 
382d0 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69  pnChange);.    i
382e0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
382f0 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
38300 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
38310 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  pnChange ){.    
38320 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
38330 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e  ntKey );.    *pn
38340 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d  Change += pPage-
38350 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66  >nCell;.  }.  if
38360 28 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29  ( freePageFlag )
38370 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  {.    rc = freeP
38380 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65  age(pPage);.  }e
38390 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71  lse if( (rc = sq
383a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
383b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
383c0 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50  ==0 ){.    zeroP
383d0 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65  age(pPage, pPage
383e0 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46  ->aData[0] | PTF
383f0 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65  _LEAF);.  }..cle
38400 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
38410 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ut:.  releasePag
38420 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75  e(pPage);.  retu
38430 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
38440 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72  Delete all infor
38450 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69  mation from a si
38460 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
38470 65 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61  e database.  iTa
38480 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61  ble is.** the pa
38490 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
384a0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62   root of the tab
384b0 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20  le.  After this 
384c0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c  routine returns,
384d0 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
384e0 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20