/ Hex Artifact Content
Login

Artifact aff035e89ae885ab64acaf339d10411a2c79829b:


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 34 37 20 32 30 30 39 2f 30  c,v 1.647 2009/0
0190: 37 2f 30 32 20 30 35 3a 32 33 3a 32 36 20 64 61  7/02 05:23:26 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 68 61 73 53 68  .  #define hasSh
0a50: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0a60: 63 6b 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20  ck(a,b,c,d) 1.  
0a70: 23 64 65 66 69 6e 65 20 68 61 73 52 65 61 64 43  #define hasReadC
0a80: 6f 6e 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30  onflicts(a, b) 0
0a90: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
0aa0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
0ab0: 52 45 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65  RED_CACHE..#ifde
0ac0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0ad0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
0ae0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0af0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0b00: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0b10: 2e 20 49 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  . It checks.** t
0b20: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  hat connection p
0b30: 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69   holds the requi
0b40: 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61  red locks to rea
0b50: 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68  d or write to th
0b60: 65 20 0a 2a 2a 20 62 2d 74 72 65 65 20 77 69 74  e .** b-tree wit
0b70: 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f  h root page iRoo
0b80: 74 2e 20 49 66 20 73 6f 2c 20 74 72 75 65 20 69  t. If so, true i
0b90: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0ba0: 72 77 69 73 65 2c 20 66 61 6c 73 65 2e 20 0a 2a  rwise, false. .*
0bb0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  * For example, w
0bc0: 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61  hen writing to a
0bd0: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 69   table b-tree wi
0be0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f  th root-page iRo
0bf0: 6f 74 20 76 69 61 20 0a 2a 2a 20 42 74 72 65 65  ot via .** Btree
0c00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72   connection pBtr
0c10: 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73  ee:.**.**    ass
0c20: 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
0c30: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74  cheTableLock(pBt
0c40: 72 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57  ree, iRoot, 0, W
0c50: 52 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a  RITE_LOCK) );.**
0c60: 0a 2a 2a 20 57 68 65 6e 20 77 72 69 74 69 6e 67  .** When writing
0c70: 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   to an index b-t
0c80: 72 65 65 20 74 68 61 74 20 72 65 73 69 64 65 73  ree that resides
0c90: 20 69 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64   in a sharable d
0ca0: 61 74 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a  atabase, the .**
0cb0: 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68   caller should h
0cc0: 61 76 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e  ave first obtain
0cd0: 65 64 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66  ed a lock specif
0ce0: 79 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61  ying the root pa
0cf0: 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72  ge of.** the cor
0d00: 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
0d10: 20 62 2d 74 72 65 65 2e 20 54 68 69 73 20 6d 61   b-tree. This ma
0d20: 6b 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74  kes things a bit
0d30: 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
0d40: 64 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f  d,.** as this mo
0d50: 64 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68  dule treats each
0d60: 20 62 2d 74 72 65 65 20 61 73 20 61 20 73 65 70   b-tree as a sep
0d70: 61 72 61 74 65 20 73 74 72 75 63 74 75 72 65 2e  arate structure.
0d80: 20 54 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a   To determine.**
0d90: 20 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65   the table b-tre
0da0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
0db0: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74  to the index b-t
0dc0: 72 65 65 20 62 65 69 6e 67 20 77 72 69 74 74 65  ree being writte
0dd0: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
0de0: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
0df0: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
0e00: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
0e10: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
0e20: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 62 2d  a lock on the b-
0e30: 74 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70  tree rooted at p
0e40: 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65 20 63  age iRoot, the c
0e50: 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c  aller may.** hol
0e60: 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  d a write-lock o
0e70: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62  n the schema tab
0e80: 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20 31 29  le (root page 1)
0e90: 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a  . This is also.*
0ea0: 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f  * acceptable..*/
0eb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 53  .static int hasS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ock(.  Btree *pB
0ee0: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  tree,         /*
0ef0: 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d 75 73   Handle that mus
0f00: 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20  t hold lock */. 
0f10: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20   Pgno iRoot,    
0f20: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
0f30: 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65 20 2a  page of b-tree *
0f40: 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65 78 2c  /.  int isIndex,
0f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0f60: 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73 20 74  ue if iRoot is t
0f70: 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e  he root of an in
0f80: 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  dex b-tree */.  
0f90: 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20 20 20  int eLockType   
0fa0: 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72         /* Requir
0fb0: 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28 52 45  ed lock type (RE
0fc0: 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45  AD_LOCK or WRITE
0fd0: 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53  _LOCK) */.){.  S
0fe0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
0ff0: 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74 72 65   (Schema *)pBtre
1000: 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b  e->pBt->pSchema;
1010: 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d 20 30  .  Pgno iTab = 0
1020: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
1030: 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  k;..  /* If this
1040: 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
1050: 20 69 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c   is not shareabl
1060: 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69  e, or if the cli
1070: 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20  ent is reading. 
1080: 20 2a 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20   ** and has the 
1090: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
10a0: 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20   flag set, then 
10b0: 6e 6f 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69  no lock is requi
10c0: 72 65 64 2e 20 0a 20 20 2a 2a 20 49 6e 20 74 68  red. .  ** In th
10d0: 65 73 65 20 63 61 73 65 73 20 72 65 74 75 72 6e  ese cases return
10e0: 20 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c   true immediatel
10f0: 79 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e  y.  If the clien
1100: 74 20 69 73 20 72 65 61 64 69 6e 67 20 0a 20 20  t is reading .  
1110: 2a 2a 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e  ** or writing an
1120: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62   index b-tree, b
1130: 75 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73  ut the schema is
1140: 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65   not loaded, the
1150: 6e 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72  n return.  ** tr
1160: 75 65 20 61 6c 73 6f 2e 20 49 6e 20 74 68 69 73  ue also. In this
1170: 20 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 69   case the lock i
1180: 73 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20  s required, but 
1190: 69 74 20 69 73 20 74 6f 6f 20 64 69 66 66 69 63  it is too diffic
11a0: 75 6c 74 0a 20 20 2a 2a 20 74 6f 20 63 68 65 63  ult.  ** to chec
11b0: 6b 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20  k if the client 
11c0: 61 63 74 75 61 6c 6c 79 20 68 6f 6c 64 73 20 69  actually holds i
11d0: 74 2e 20 54 68 69 73 20 64 6f 65 73 6e 27 74 20  t. This doesn't 
11e0: 68 61 70 70 65 6e 20 76 65 72 79 0a 20 20 2a 2a  happen very.  **
11f0: 20 6f 66 74 65 6e 2e 20 20 2a 2f 0a 20 20 69 66   often.  */.  if
1200: 28 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61  ( (pBtree->shara
1210: 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65  ble==0).   || (e
1220: 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c  LockType==READ_L
1230: 4f 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e  OCK && (pBtree->
1240: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1250: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
1260: 65 64 29 29 0a 20 20 20 7c 7c 20 28 69 73 49 6e  ed)).   || (isIn
1270: 64 65 78 20 26 26 20 28 21 70 53 63 68 65 6d 61  dex && (!pSchema
1280: 20 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 66 6c   || (pSchema->fl
1290: 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f 61  ags&DB_SchemaLoa
12a0: 64 65 64 29 3d 3d 30 20 29 29 0a 20 20 29 7b 0a  ded)==0 )).  ){.
12b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
12c0: 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
12d0: 75 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ut the root-page
12e0: 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73   that the lock s
12f0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e  hould be held on
1300: 2e 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a  . For table.  **
1310: 20 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69   b-trees, this i
1320: 73 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20  s just the root 
1330: 70 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72  page of the b-tr
1340: 65 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72  ee being read or
1350: 0a 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46  .  ** written. F
1360: 6f 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73  or index b-trees
1370: 2c 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  , it is the root
1380: 20 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73   page of the ass
1390: 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62  ociated.  ** tab
13a0: 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  le.  */.  if( is
13b0: 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73  Index ){.    Has
13c0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f  hElem *p;.    fo
13d0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
13e0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  rst(&pSchema->id
13f0: 78 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  xHash); p; p=sql
1400: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
1410: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
1420: 64 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71  dx = (Index *)sq
1430: 6c 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b  liteHashData(p);
1440: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1450: 3e 74 6e 75 6d 3d 3d 69 52 6f 6f 74 20 29 7b 0a  >tnum==iRoot ){.
1460: 09 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54  .iTab = pIdx->pT
1470: 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20  able->tnum;.    
1480: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1490: 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52  e{.    iTab = iR
14a0: 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  oot;.  }..  /* S
14b0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 65  earch for the re
14c0: 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74  quired lock. Eit
14d0: 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  her a write-lock
14e0: 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69 54   on root-page iT
14f0: 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69 74  ab, a .  ** writ
1500: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63  e-lock on the sc
1510: 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20 28  hema table, or (
1520: 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73  if the client is
1530: 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a   reading) a.  **
1540: 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54   read-lock on iT
1550: 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e  ab will suffice.
1560: 20 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 79   Return 1 if any
1570: 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 66 6f   of these are fo
1580: 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70  und.  */.  for(p
1590: 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74  Lock=pBtree->pBt
15a0: 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20  ->pLock; pLock; 
15b0: 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65  pLock=pLock->pNe
15c0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f  xt){.    if( pLo
15d0: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 72  ck->pBtree==pBtr
15e0: 65 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c 6f  ee .     && (pLo
15f0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  ck->iTable==iTab
1600: 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63   || (pLock->eLoc
1610: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26  k==WRITE_LOCK &&
1620: 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d   pLock->iTable==
1630: 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f 63  1)).     && pLoc
1640: 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54  k->eLock>=eLockT
1650: 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ype .    ){.    
1660: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1670: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c  }.  }..  /* Fail
1680: 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72  ed to find the r
1690: 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f  equired lock. */
16a0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
16b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
16c0: 69 6f 6e 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ion is also used
16d0: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
16e0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
16f0: 6f 6e 6c 79 2e 20 49 74 20 0a 2a 2a 20 72 65 74  only. It .** ret
1700: 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
1710: 72 65 20 65 78 69 73 74 20 6f 6e 65 20 6f 72 20  re exist one or 
1720: 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 70 65  more cursors ope
1730: 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a  n on the table .
1740: 2a 2a 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  ** with root pag
1750: 65 20 69 52 6f 6f 74 20 74 68 61 74 20 64 6f 20  e iRoot that do 
1760: 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 65 69  not belong to ei
1770: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
1780: 70 42 74 72 65 65 20 0a 2a 2a 20 6f 72 20 73 6f  pBtree .** or so
1790: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
17a0: 69 6f 6e 20 74 68 61 74 20 68 61 73 20 74 68 65  ion that has the
17b0: 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65   read-uncommitte
17c0: 64 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  d flag set..**.*
17d0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
17e0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
17f0: 20 70 61 67 65 20 69 52 6f 6f 74 3a 0a 2a 2a 0a   page iRoot:.**.
1800: 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 21 68  **    assert( !h
1810: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1820: 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29  pBtree, iRoot) )
1830: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
1840: 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
1850: 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
1860: 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42  Pgno iRoot){.  B
1870: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f  tCursor *p;.  fo
1880: 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  r(p=pBtree->pBt-
1890: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
18a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
18b0: 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  ( p->pgnoRoot==i
18c0: 52 6f 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d  Root .     && p-
18d0: 3e 70 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a  >pBtree!=pBtree.
18e0: 20 20 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70       && 0==(p->p
18f0: 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73  Btree->db->flags
1900: 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e   & SQLITE_ReadUn
1910: 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20 20 29  committed).    )
1920: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1930: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1940: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1950: 20 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51      /* #ifdef SQ
1960: 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f  LITE_DEBUG */../
1970: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65  *.** Query to se
1980: 65 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c  e if btree handl
1990: 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61  e p may obtain a
19a0: 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c   lock of type eL
19b0: 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f  ock .** (READ_LO
19c0: 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b  CK or WRITE_LOCK
19d0: 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77  ) on the table w
19e0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
19f0: 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51  ab. Return.** SQ
1a00: 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c  LITE_OK if the l
1a10: 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69  ock may be obtai
1a20: 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a  ned (by calling.
1a30: 2a 2a 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ** setSharedCach
1a40: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f  eTableLock()), o
1a50: 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  r SQLITE_LOCKED 
1a60: 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  if not..*/.stati
1a70: 63 20 69 6e 74 20 71 75 65 72 79 53 68 61 72 65  c int queryShare
1a80: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1a90: 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69  Btree *p, Pgno i
1aa0: 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  Tab, u8 eLock){.
1ab0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1ac0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
1ad0: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
1ae0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
1af0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
1b00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
1b10: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
1b20: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
1b30: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
1b40: 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a 20  p->db!=0 );.  . 
1b50: 20 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e   /* If requestin
1b60: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20  g a write-lock, 
1b70: 74 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d  then the Btree m
1b80: 75 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e  ust have an open
1b90: 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e   write.  ** tran
1ba0: 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20  saction on this 
1bb0: 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f  file. And, obvio
1bc0: 75 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74  usly, for this t
1bd0: 6f 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20  o be so there . 
1be0: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f   ** must be an o
1bf0: 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
1c00: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c  ction on the fil
1c10: 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20  e itself..  */. 
1c20: 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d   assert( eLock==
1c30: 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d  READ_LOCK || (p=
1c40: 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26  =pBt->pWriter &&
1c50: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1c60: 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61  NS_WRITE) );.  a
1c70: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
1c80: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e  AD_LOCK || pBt->
1c90: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1ca0: 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1cb0: 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20  .  /* This is a 
1cc0: 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61  no-op if the sha
1cd0: 72 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74  red-cache is not
1ce0: 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66   enabled */.  if
1cf0: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  ( !p->sharable )
1d00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d10: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
1d20: 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  * If some other 
1d30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f  connection is ho
1d40: 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  lding an exclusi
1d50: 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a  ve lock, the.  *
1d60: 2a 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  * requested lock
1d70: 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61   may not be obta
1d80: 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ined..  */.  if(
1d90: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70   pBt->pWriter!=p
1da0: 20 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c 75   && pBt->isExclu
1db0: 73 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  sive ){.    sqli
1dc0: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
1dd0: 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d  cked(p->db, pBt-
1de0: 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20  >pWriter->db);. 
1df0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e00: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
1e10: 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  CHE;.  }..  /* T
1e20: 68 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20  his (along with 
1e30: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1e40: 62 6c 65 4c 6f 63 6b 28 29 29 20 69 73 20 77 68  bleLock()) is wh
1e50: 65 72 65 0a 20 20 2a 2a 20 74 68 65 20 52 65 61  ere.  ** the Rea
1e60: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1e70: 67 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 2e  g is dealt with.
1e80: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  .  ** If the cal
1e90: 6c 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20  ler is querying 
1ea0: 66 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  for a read-lock 
1eb0: 6f 6e 20 61 6e 79 20 74 61 62 6c 65 0a 20 20 2a  on any table.  *
1ec0: 2a 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  * other than the
1ed0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
1ee0: 61 62 6c 65 20 28 74 61 62 6c 65 20 31 29 20 61  able (table 1) a
1ef0: 6e 64 20 69 66 20 74 68 65 20 52 65 61 64 55 6e  nd if the ReadUn
1f00: 63 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66  committed.  ** f
1f10: 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e  lag is set, then
1f20: 20 74 68 65 20 6c 6f 63 6b 20 67 72 61 6e 74 65   the lock grante
1f30: 64 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20  d even if there 
1f40: 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a  are write-locks.
1f50: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c    ** on the tabl
1f60: 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f  e. If a write-lo
1f70: 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
1f80: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
1f90: 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69  tted flag.  ** i
1fa0: 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64  s not considered
1fb0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66  ..  **.  ** In f
1fc0: 75 6e 63 74 69 6f 6e 20 73 65 74 53 68 61 72 65  unction setShare
1fd0: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1fe0: 29 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63  ), if a read-loc
1ff0: 6b 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e  k is demanded an
2000: 64 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64  d the .  ** Read
2010: 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
2020: 20 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72   is set, no entr
2030: 79 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  y is added to th
2040: 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20  e locks list .  
2050: 2a 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f  ** (BtShared.pLo
2060: 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ck)..  **.  ** T
2070: 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20  o summarize: If 
2080: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
2090: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ted flag is set,
20a0: 20 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f   then read curso
20b0: 72 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d 73  rs.  ** on non-s
20c0: 63 68 65 6d 61 20 74 61 62 6c 65 73 20 64 6f 20  chema tables do 
20d0: 6e 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65  not create or re
20e0: 73 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b  spect table lock
20f0: 73 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 20  s. The locking. 
2100: 20 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 66 6f   ** procedure fo
2110: 72 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72  r a write-cursor
2120: 20 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65   does not change
2130: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20  ..  */.  if( .  
2140: 20 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61    0==(p->db->fla
2150: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
2160: 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20  committed) || . 
2170: 20 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f     eLock==WRITE_
2180: 4c 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62  LOCK ||.    iTab
2190: 3d 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20  ==MASTER_ROOT.  
21a0: 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72  ){.    for(pIter
21b0: 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
21c0: 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
21d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 2f  >pNext){.      /
21e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
21f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2200: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2210: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2220: 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
2230: 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69  nt is a simplifi
2240: 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 20  cation of:.     
2250: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28   **.      **   (
2260: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
2270: 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63  K || pIter->eLoc
2280: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20  k==WRITE_LOCK). 
2290: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
22a0: 20 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74   since we know t
22b0: 68 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52  hat if eLock==WR
22c0: 49 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e  ITE_LOCK, then n
22d0: 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  o other connecti
22e0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  on.      ** may 
22f0: 68 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43  hold a WRITE_LOC
2300: 4b 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69  K on any table i
2310: 6e 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e  n this file (sin
2320: 63 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20  ce there can.   
2330: 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20     ** only be a 
2340: 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a  single writer)..
2350: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
2360: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c  ssert( pIter->eL
2370: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2380: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
2390: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
23a0: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
23b0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23c0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
23d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
23e0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
23f0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
2400: 42 74 72 65 65 21 3d 70 20 26 26 20 70 49 74 65  Btree!=p && pIte
2410: 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  r->iTable==iTab 
2420: 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21  && pIter->eLock!
2430: 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  =eLock ){.      
2440: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2450: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2460: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2470: 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >db);.        if
2480: 28 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  ( eLock==WRITE_L
2490: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
24a0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d   assert( p==pBt-
24b0: 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20  >pWriter );.    
24c0: 20 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e        pBt->isPen
24d0: 64 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ding = 1;.      
24e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
24f0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2500: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2520: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2530: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2540: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2550: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2560: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2570: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2580: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2590: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
25a0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
25b0: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
25c0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
25d0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
25e0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
25f0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
2600: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
2610: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2620: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2630: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2640: 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73   lock is added s
2650: 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c  uccessfully. SQL
2660: 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20  ITE_BUSY and.** 
2670: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79  SQLITE_NOMEM may
2680: 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65   also be returne
2690: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
26a0: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
26b0: 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a  ableLock(Btree *
26c0: 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20  p, Pgno iTable, 
26d0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
26e0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
26f0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2700: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f  Lock = 0;.  BtLo
2710: 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73  ck *pIter;..  as
2720: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2730: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
2740: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f  );.  assert( eLo
2750: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
2760: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
2770: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2780: 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f  p->db!=0 );..  /
2790: 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
27a0: 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d  p if the shared-
27b0: 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61  cache is not ena
27c0: 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70  bled */.  if( !p
27d0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
27e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27f0: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  OK;.  }..  asser
2800: 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75  t( SQLITE_OK==qu
2810: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
2820: 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
2830: 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20  e, eLock) );..  
2840: 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75  /* If the read-u
2850: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2860: 69 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61  is set and a rea
2870: 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  d-lock is reques
2880: 74 65 64 20 6f 6e 0a 20 20 2a 2a 20 61 20 6e 6f  ted on.  ** a no
2890: 6e 2d 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20  n-schema table, 
28a0: 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73  then the lock is
28b0: 20 61 6c 77 61 79 73 20 67 72 61 6e 74 65 64 2e   always granted.
28c0: 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79 0a 20    Return early. 
28d0: 20 2a 2a 20 77 69 74 68 6f 75 74 20 61 64 64 69   ** without addi
28e0: 6e 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  ng an entry to t
28f0: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
2900: 6b 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a  k list. See.  **
2910: 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63   comment in func
2920: 74 69 6f 6e 20 71 75 65 72 79 53 68 61 72 65 64  tion queryShared
2930: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
2940: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 0a 20   for more info. 
2950: 20 2a 2a 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20   ** on handling 
2960: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
2970: 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20  ted flag..  */. 
2980: 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64 62   if( .    (p->db
2990: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
29a0: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20  eadUncommitted) 
29b0: 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d  && .    (eLock==
29c0: 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20  READ_LOCK) &&.  
29d0: 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52    iTable!=MASTER
29e0: 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72  _ROOT.  ){.    r
29f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2a00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74  .  }..  /* First
2a10: 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74   search the list
2a20: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
2a30: 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61   lock on this ta
2a40: 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49  ble. */.  for(pI
2a50: 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
2a60: 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
2a70: 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
2a80: 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c  if( pIter->iTabl
2a90: 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74  e==iTable && pIt
2aa0: 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  er->pBtree==p ){
2ab0: 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70  .      pLock = p
2ac0: 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61  Iter;.      brea
2ad0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
2ae0: 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
2af0: 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66  search did not f
2b00: 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72  ind a BtLock str
2b10: 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20  uct associating 
2b20: 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74  Btree p.  ** wit
2b30: 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20  h table iTable, 
2b40: 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64  allocate one and
2b50: 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68   link it into th
2b60: 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e list..  */.  i
2b70: 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20  f( !pLock ){.   
2b80: 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b   pLock = (BtLock
2b90: 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
2ba0: 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f  Zero(sizeof(BtLo
2bb0: 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ck));.    if( !p
2bc0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65  Lock ){.      re
2bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2be0: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f  M;.    }.    pLo
2bf0: 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61  ck->iTable = iTa
2c00: 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  ble;.    pLock->
2c10: 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20  pBtree = p;.    
2c20: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  pLock->pNext = p
2c30: 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70  Bt->pLock;.    p
2c40: 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63  Bt->pLock = pLoc
2c50: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  k;.  }..  /* Set
2c60: 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63   the BtLock.eLoc
2c70: 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68  k variable to th
2c80: 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65  e maximum of the
2c90: 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20   current lock.  
2ca0: 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ** and the reque
2cb0: 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20  sted lock. This 
2cc0: 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65  means if a write
2cd0: 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64  -lock was alread
2ce0: 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20  y held.  ** and 
2cf0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75  a read-lock requ
2d00: 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20  ested, we don't 
2d10: 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e  incorrectly down
2d20: 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a  grade the lock..
2d30: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57    */.  assert( W
2d40: 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c  RITE_LOCK>READ_L
2d50: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f  OCK );.  if( eLo
2d60: 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  ck>pLock->eLock 
2d70: 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c  ){.    pLock->eL
2d80: 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d  ock = eLock;.  }
2d90: 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2da0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
2db0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  * !SQLITE_OMIT_S
2dc0: 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a  HARED_CACHE */..
2dd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2de0: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2df0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
2e00: 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63  ll the table loc
2e10: 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e  ks (locks obtain
2e20: 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a  ed via calls to.
2e30: 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64  ** the setShared
2e40: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
2e50: 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64   procedure) held
2e60: 20 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65   by Btree handle
2e70: 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66   p..**.** This f
2e80: 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20  unction assumes 
2e90: 74 68 61 74 20 68 61 6e 64 6c 65 20 70 20 68 61  that handle p ha
2ea0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
2eb0: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
2ec0: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
2ed0: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
2ee0: 65 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e  e BtShared.isPen
2ef0: 64 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ding variable.**
2f00: 20 6d 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63   may be incorrec
2f10: 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a  tly cleared..*/.
2f20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
2f30: 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
2f40: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
2f50: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
2f60: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2f70: 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72   BtLock **ppIter
2f80: 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a   = &pBt->pLock;.
2f90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2fa0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2fb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2fc0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c  ( p->sharable ||
2fd0: 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20   0==*ppIter );. 
2fe0: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
2ff0: 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c  ans>0 );..  whil
3000: 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20  e( *ppIter ){.  
3010: 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20    BtLock *pLock 
3020: 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61  = *ppIter;.    a
3030: 73 73 65 72 74 28 20 70 42 74 2d 3e 69 73 45 78  ssert( pBt->isEx
3040: 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42  clusive==0 || pB
3050: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63  t->pWriter==pLoc
3060: 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20  k->pBtree );.   
3070: 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e   assert( pLock->
3080: 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e  pBtree->inTrans>
3090: 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b  =pLock->eLock );
30a0: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
30b0: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
30c0: 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f     *ppIter = pLo
30d0: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
30e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
30f0: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
3100: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
3110: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
3120: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
3130: 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64 69  rt( pBt->isPendi
3140: 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ng==0 || pBt->pW
3150: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3160: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3170: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3180: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3190: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
31a0: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
31b0: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ding = 0;.  }els
31c0: 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e  e if( pBt->nTran
31d0: 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20  saction==2 ){.  
31e0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
31f0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
3200: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 69  n connection p i
3210: 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73  s concluding its
3220: 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
3230: 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63  tion. If there c
3240: 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20  urrently exists 
3250: 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20  a writer, and p 
3260: 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68  is not.    ** th
3270: 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20  at writer, then 
3280: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
3290: 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
32a0: 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20  ections other.  
32b0: 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72    ** than the wr
32c0: 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f  iter must be abo
32d0: 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65  ut to drop to ze
32e0: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
32f0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20  .    ** set the 
3300: 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74  isPending flag t
3310: 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 0..    **.    
3320: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
3330: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77  ot currently a w
3340: 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68  riter, then BtSh
3350: 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d  ared.isPending m
3360: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3370: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3380: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3390: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
33a0: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
33b0: 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e     pBt->isPendin
33c0: 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  g = 0;.  }.}.#en
33d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
33e0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
33f0: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3400: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3410: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3420: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3430: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  ce */../*.** Ver
3440: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 75 72  ify that the cur
3450: 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75 74 65  sor holds a mute
3460: 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
3470: 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  d.*/.#ifndef NDE
3480: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 63  BUG.static int c
3490: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
34a0: 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
34b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
34c0: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
34d0: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
34e0: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
34f0: 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
3500: 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  B./*.** Invalida
3510: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
3520: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
3530: 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75 72 2c  for cursor pCur,
3540: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
3550: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
3560: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
3570: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
3580: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
3590: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
35a0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) );.  sqlite3_f
35b0: 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
35c0: 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 61 4f  low);.  pCur->aO
35d0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d 0a 0a  verflow = 0;.}..
35e0: 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65  /*.** Invalidate
35f0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
3600: 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f  ge-list cache fo
3610: 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  r all cursors op
3620: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  ened.** on the s
3630: 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75  hared btree stru
3640: 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74  cture pBt..*/.st
3650: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
3660: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3670: 61 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70  ache(BtShared *p
3680: 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
3690: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
36a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36b0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
36c0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
36d0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
36e0: 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69  ext){.    invali
36f0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3700: 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  e(p);.  }.}../*.
3710: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3720: 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
3730: 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
3740: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 74 61  contents of a ta
3750: 62 6c 65 0a 2a 2a 20 62 2d 74 72 65 65 20 74 6f  ble.** b-tree to
3760: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
3770: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
3780: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
3790: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
37a0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
37b0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
37c0: 41 72 67 75 6d 65 6e 74 20 70 67 6e 6f 52 6f 6f  Argument pgnoRoo
37d0: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 6f 6f  t is the .** roo
37e0: 74 2d 70 61 67 65 20 6f 66 20 74 68 65 20 74 61  t-page of the ta
37f0: 62 6c 65 20 62 2d 74 72 65 65 2e 20 0a 2a 2a 0a  ble b-tree. .**.
3800: 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 69  ** If argument i
3810: 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20 74  sClearTable is t
3820: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 65 6e  rue, then the en
3830: 74 69 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tire contents of
3840: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 69 73   the.** table is
3850: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 64 65 6c   about to be del
3860: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3870: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  se invalidate al
3880: 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a 20 63 75  l incrblob.** cu
3890: 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 61 6e  rsors open on an
38a0: 79 20 72 6f 77 20 77 69 74 68 69 6e 20 74 68 65  y row within the
38b0: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
38c0: 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a  -page pgnoRoot..
38d0: 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
38e0: 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 73 43   if argument isC
38f0: 6c 65 61 72 54 61 62 6c 65 20 69 73 20 66 61 6c  learTable is fal
3900: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 77  se, then the row
3910: 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69 64 20 69   with.** rowid i
3920: 52 6f 77 20 69 73 20 62 65 69 6e 67 20 72 65 70  Row is being rep
3930: 6c 61 63 65 64 20 6f 72 20 64 65 6c 65 74 65 64  laced or deleted
3940: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
3950: 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20 6f 6e 6c  nvalidate.** onl
3960: 79 20 74 68 6f 73 65 20 69 6e 63 72 62 6c 6f 62  y those incrblob
3970: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3980: 20 74 68 69 73 20 73 70 65 63 69 66 69 63 20 72   this specific r
3990: 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ow..*/.static vo
39a0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63  id invalidateInc
39b0: 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 0a 20 20  rblobCursors(.  
39c0: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
39d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
39e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
39f0: 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20  check */.  Pgno 
3a00: 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20  pgnoRoot,       
3a10: 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
3a20: 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
3a30: 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  his btree */.  i
3a40: 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20  64 iRow,        
3a50: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f         /* The ro
3a60: 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62  wid that might b
3a70: 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20  e changing */.  
3a80: 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  int isClearTable
3a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3aa0: 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20  if all rows are 
3ab0: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
3ac0: 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
3ad0: 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
3ae0: 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
3af0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
3b00: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
3b10: 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20  ex(pBtree) );.  
3b20: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
3b30: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
3b40: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  t){.    if( p->i
3b50: 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
3b60: 26 26 20 28 69 73 43 6c 65 61 72 54 61 62 6c 65  && (isClearTable
3b70: 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   || p->info.nKey
3b80: 3d 3d 69 52 6f 77 29 20 29 7b 0a 20 20 20 20 20  ==iRow) ){.     
3b90: 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
3ba0: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
3bb0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65 0a   }.  }.}..#else.
3bc0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3bd0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3be0: 65 28 78 29 0a 20 20 23 64 65 66 69 6e 65 20 69  e(x).  #define i
3bf0: 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
3c00: 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20 20 23  flowCache(x).  #
3c10: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3c20: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3c30: 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66  (w,x,y,z).#endif
3c40: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20  ../*.** Set bit 
3c50: 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68  pgno of the BtSh
3c60: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
3c70: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73   bitvec. This is
3c80: 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e   called .** when
3c90: 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65   a page that pre
3ca0: 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65  viously containe
3cb0: 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61  d data becomes a
3cc0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
3cd0: 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  .** page..**.** 
3ce0: 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  The BtShared.pHa
3cf0: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20  sContent bitvec 
3d00: 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61  exists to work a
3d10: 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65  round an obscure
3d20: 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62  .** bug caused b
3d30: 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f  y the interactio
3d40: 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20  n of two useful 
3d50: 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  IO optimizations
3d60: 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20   surrounding.** 
3d70: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
3d80: 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29  ages:.**.**   1)
3d90: 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69   When all data i
3da0: 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  s deleted from a
3db0: 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61   page and the pa
3dc0: 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20  ge becomes.**   
3dd0: 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c     a free-list l
3de0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61  eaf page, the pa
3df0: 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  ge is not writte
3e00: 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
3e10: 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72  e.**      (as fr
3e20: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
3e30: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65  es contain no me
3e40: 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20  aningful data). 
3e50: 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20  Sometimes.**    
3e60: 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73    such a page is
3e70: 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61   not even journa
3e80: 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c  lled (as it will
3e90: 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64   not be modified
3ea0: 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f  ,.**      why bo
3eb0: 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67  ther journalling
3ec0: 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   it?)..**.**   2
3ed0: 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69  ) When a free-li
3ee0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  st leaf page is 
3ef0: 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74  reused, its cont
3f00: 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a  ent is not read.
3f10: 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65  **      from the
3f20: 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69   database or wri
3f30: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
3f40: 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68  nal file (why sh
3f50: 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20  ould it.**      
3f60: 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  be, if it is not
3f70: 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66   at all meaningf
3f80: 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74  ul?)..**.** By t
3f90: 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65  hemselves, these
3fa0: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77   optimizations w
3fb0: 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f  ork fine and pro
3fc0: 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20  vide a handy.** 
3fd0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73  performance boos
3fe0: 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65  t to bulk delete
3ff0: 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61   or insert opera
4000: 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20  tions. However, 
4010: 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20  if.** a page is 
4020: 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
4030: 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20  e-list and then 
4040: 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68  reused within th
4050: 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61  e same.** transa
4060: 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d  ction, a problem
4070: 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68   comes up. If th
4080: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f  e page is not jo
4090: 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a  urnalled when.**
40a0: 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20   it is moved to 
40b0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
40c0: 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74  d it is also not
40d0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e   journalled when
40e0: 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63   it.** is extrac
40f0: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
4100: 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65  e-list and reuse
4110: 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67  d, then the orig
4120: 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79  inal data.** may
4130: 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65   be lost. In the
4140: 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
4150: 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74  back, it may not
4160: 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20   be possible.** 
4170: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
4180: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
4190: 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72  riginal configur
41a0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
41b0: 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65   solution is the
41c0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
41d0: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68  ntent bitvec. Wh
41e0: 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73  enever a page is
41f0: 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65   .** moved to be
4200: 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74  come a free-list
4210: 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20   leaf page, the 
4220: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
4230: 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74  t is.** set in t
4240: 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65  he bitvec. Whene
4250: 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20  ver a leaf page 
4260: 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  is extracted fro
4270: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  m the free-list,
4280: 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  .** optimization
4290: 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 6d 69   2 above is ommi
42a0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
42b0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
42c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
42d0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
42e0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
42f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4300: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4310: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4320: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4330: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4340: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4350: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4360: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4370: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4380: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
4390: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
43a0: 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  .    int nPage;.
43b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
43c0: 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
43d0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61  Bt->pPager, &nPa
43e0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
43f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4400: 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e      pBt->pHasCon
4410: 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  tent = sqlite3Bi
4420: 74 76 65 63 43 72 65 61 74 65 28 28 75 33 32 29  tvecCreate((u32)
4430: 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
4440: 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ( !pBt->pHasCont
4450: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ent ){.        r
4460: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4480: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
4490: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c  LITE_OK && pgno<
44a0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  =sqlite3BitvecSi
44b0: 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ze(pBt->pHasCont
44c0: 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ent) ){.    rc =
44d0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
44e0: 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  t(pBt->pHasConte
44f0: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  nt, pgno);.  }. 
4500: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4510: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42  *.** Query the B
4520: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4530: 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  ent vector..**.*
4540: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4550: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
4560: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4570: 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20  page is removed 
4580: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65  from the.** free
4590: 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e  -list for reuse.
45a0: 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73   It returns fals
45b0: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
45c0: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a  to retrieve the.
45d0: 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ** page from the
45e0: 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
45f0: 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
4600: 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75  t' flag set. Tru
4610: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
4620: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4630: 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  GetHasContent(Bt
4640: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
4650: 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65  o pgno){.  Bitve
4660: 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73  c *p = pBt->pHas
4670: 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72  Content;.  retur
4680: 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71  n (p && (pgno>sq
4690: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
46a0: 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  p) || sqlite3Bit
46b0: 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29  vecTest(p, pgno)
46c0: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ));.}../*.** Cle
46d0: 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65  ar (destroy) the
46e0: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
46f0: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68  ntent bitvec. Th
4700: 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  is should be.** 
4710: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
4720: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63  onclusion of eac
4730: 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  h write-transact
4740: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
4750: 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61  oid btreeClearHa
4760: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4770: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
4780: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
4790: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
47a0: 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  );.  pBt->pHasCo
47b0: 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ntent = 0;.}../*
47c0: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72  .** Save the cur
47d0: 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69  rent cursor posi
47e0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69  tion in the vari
47f0: 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e  ables BtCursor.n
4800: 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75  Key .** and BtCu
4810: 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63  rsor.pKey. The c
4820: 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73  ursor's state is
4830: 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52   set to CURSOR_R
4840: 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a 73  EQUIRESEEK..*/.s
4850: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
4860: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
4870: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
4880: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
4890: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
48a0: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
48b0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
48c0: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
48d0: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
48e0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
48f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
4900: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
4910: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
4920: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
4930: 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65   an intKey table
4940: 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65  , then the above
4950: 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65   call to BtreeKe
4960: 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f  ySize().  ** sto
4970: 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  res the integer 
4980: 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65  key in pCur->nKe
4990: 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  y. In this case 
49a0: 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20  this value is.  
49b0: 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72  ** all that is r
49c0: 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69  equired. Otherwi
49d0: 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e  se, if pCur is n
49e0: 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e  ot open on an in
49f0: 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  tKey.  ** table,
4a00: 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61   then malloc spa
4a10: 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65  ce for and store
4a20: 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20   the pCur->nKey 
4a30: 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20  bytes of key .  
4a40: 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20 20  ** data..  */.  
4a50: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4a60: 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61 70  K && 0==pCur->ap
4a70: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 29  Page[0]->intKey)
4a80: 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  {.    void *pKey
4a90: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
4aa0: 28 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65  ( (int)pCur->nKe
4ab0: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
4ac0: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
4ad0: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
4ae0: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
4af0: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
4b00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
4b10: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4b20: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
4b30: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
4b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
4b50: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
4b60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
4b70: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
4b80: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
4b90: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
4ba0: 21 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  !pCur->apPage[0]
4bb0: 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75  ->intKey || !pCu
4bc0: 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a 20 20 69 66  r->pKey );..  if
4bd0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4be0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
4bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
4c00: 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
4c10: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
4c20: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
4c30: 69 5d 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  i]);.      pCur-
4c40: 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a  >apPage[i] = 0;.
4c50: 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
4c60: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 20 20  iPage = -1;.    
4c70: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
4c80: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
4c90: 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c 69  K;.  }..  invali
4ca0: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
4cb0: 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72  e(pCur);.  retur
4cc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
4cd0: 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
4ce0: 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73  s of all cursors
4cf0: 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74 20   except pExcept 
4d00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62 6c  open on the tabl
4d10: 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74 2d  e .** with root-
4d20: 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75 61  page iRoot. Usua
4d30: 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c  lly, this is cal
4d40: 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20  led just before 
4d50: 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65 70  cursor.** pExcep
4d60: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
4d70: 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28 42  ify the table (B
4d80: 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
4d90: 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e 0a  BtreeInsert())..
4da0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
4db0: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
4dc0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
4dd0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
4de0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
4df0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
4e00: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
4e10: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
4e20: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
4e30: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
4e40: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
4e50: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
4e60: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
4e70: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
4e80: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
4e90: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
4ea0: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
4eb0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d 3e   && .        p->
4ec0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
4ed0: 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69 6e  ALID ){.      in
4ee0: 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f  t rc = saveCurso
4ef0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
4f00: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
4f10: 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20  K!=rc ){.       
4f20: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
4f30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
4f60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
4f70: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
4f80: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
4f90: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
4fa0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4fb0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
4fc0: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
4fd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
4fe0: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
4ff0: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
5000: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
5010: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
5020: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f  ;.}../*.** Resto
5030: 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  re the cursor to
5040: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
5050: 20 77 61 73 20 69 6e 20 28 6f 72 20 61 73 20 63   was in (or as c
5060: 6c 6f 73 65 20 74 6f 20 61 73 20 70 6f 73 73 69  lose to as possi
5070: 62 6c 65 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76  ble).** when sav
5080: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
5090: 29 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f  ) was called. No
50a0: 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6c  te that this cal
50b0: 6c 20 64 65 6c 65 74 65 73 20 74 68 65 20 0a 2a  l deletes the .*
50c0: 2a 20 73 61 76 65 64 20 70 6f 73 69 74 69 6f 6e  * saved position
50d0: 20 69 6e 66 6f 20 73 74 6f 72 65 64 20 62 79 20   info stored by 
50e0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
50f0: 6f 6e 28 29 2c 20 73 6f 20 74 68 65 72 65 20 63  on(), so there c
5100: 61 6e 20 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74  an be.** at most
5110: 20 6f 6e 65 20 65 66 66 65 63 74 69 76 65 20 72   one effective r
5120: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5130: 74 69 6f 6e 28 29 20 63 61 6c 6c 20 61 66 74 65  tion() call afte
5140: 72 20 65 61 63 68 20 0a 2a 2a 20 73 61 76 65 43  r each .** saveC
5150: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e  ursorPosition().
5160: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
5170: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
5180: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
5190: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
51a0: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 63   rc;.  assert( c
51b0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
51c0: 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
51d0: 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  t( pCur->eState>
51e0: 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
51f0: 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75  EEK );.  if( pCu
5200: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
5210: 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
5220: 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
5230: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
5240: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
5250: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 73 71  VALID;.  rc = sq
5260: 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
5270: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
5280: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
5290: 2c 20 26 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a  , &pCur->skip);.
52a0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
52b0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
52c0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
52d0: 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70  ey);.    pCur->p
52e0: 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  Key = 0;.    ass
52f0: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
5300: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
5310: 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  || pCur->eState=
5320: 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
5330: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
5340: 72 63 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72  rc;.}..#define r
5350: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5360: 74 69 6f 6e 28 70 29 20 5c 0a 20 20 28 70 2d 3e  tion(p) \.  (p->
5370: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
5380: 45 51 55 49 52 45 53 45 45 4b 20 3f 20 5c 0a 20  EQUIRESEEK ? \. 
5390: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
53a0: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
53b0: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
53c0: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
53d0: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
53e0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
53f0: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
5400: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
5410: 20 70 6f 73 69 74 69 6f 6e 20 69 74 0a 2a 2a 20   position it.** 
5420: 77 61 73 20 6c 61 73 74 20 70 6c 61 63 65 64 20  was last placed 
5430: 61 74 2e 20 20 43 75 72 73 6f 72 73 20 63 61 6e  at.  Cursors can
5440: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
5450: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
5460: 74 69 6e 67 0a 2a 2a 20 61 74 20 69 73 20 64 65  ting.** at is de
5470: 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
5480: 6e 64 65 72 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  nder them..**.**
5490: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
54a0: 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 63  turns an error c
54b0: 6f 64 65 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ode if something
54c0: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 20 20 54 68   goes wrong.  Th
54d0: 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 2a 70 48  e.** integer *pH
54e0: 61 73 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  asMoved is set t
54f0: 6f 20 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72  o one if the cur
5500: 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 61 6e  sor has moved an
5510: 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 69  d 0 if not..*/.i
5520: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
5530: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 42 74  ursorHasMoved(Bt
5540: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
5550: 74 20 2a 70 48 61 73 4d 6f 76 65 64 29 7b 0a 20  t *pHasMoved){. 
5560: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d   int rc;..  rc =
5570: 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
5580: 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
5590: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70  if( rc ){.    *p
55a0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
55b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
55c0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
55d0: 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
55e0: 44 20 7c 7c 20 70 43 75 72 2d 3e 73 6b 69 70 21  D || pCur->skip!
55f0: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d  =0 ){.    *pHasM
5600: 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  oved = 1;.  }els
5610: 65 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65  e{.    *pHasMove
5620: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
5630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
5640: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
5650: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
5660: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
5670: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
5680: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
5690: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
56a0: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
56b0: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
56c0: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
56d0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
56e0: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
56f0: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
5700: 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70  */.static Pgno p
5710: 74 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68  trmapPageno(BtSh
5720: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5730: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61  pgno){.  int nPa
5740: 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20  gesPerMapPage;. 
5750: 20 50 67 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72   Pgno iPtrMap, r
5760: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
5770: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5780: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5790: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
57a0: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
57b0: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
57c0: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
57d0: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
57e0: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
57f0: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
5800: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
5810: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
5820: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
5830: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
5840: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5850: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
5860: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
5870: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
5880: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
5890: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
58a0: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
58b0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
58c0: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
58d0: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
58e0: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
58f0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
5900: 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  no'..** An error
5910: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5920: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
5930: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
5940: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
5950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
5960: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
5970: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
5980: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
5990: 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67  parent){.  DbPag
59a0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
59b0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
59c0: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
59d0: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
59e0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
59f0: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
5a00: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
5a10: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
5a20: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
5a30: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
5a40: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
5a50: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
5a60: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
5a70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
5a80: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
5a90: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
5aa0: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
5ab0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
5ac0: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
5ad0: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
5ae0: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
5af0: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
5b00: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
5b10: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
5b20: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
5b30: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
5b40: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
5b50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5b60: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
5b70: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
5b80: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
5b90: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
5ba0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
5bb0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
5bc0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
5bd0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5be0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
5bf0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
5c00: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
5c10: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
5c20: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
5c30: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 72 65  fset<0 ){.    re
5c40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
5c50: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
5c60: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
5c70: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
5c80: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
5c90: 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72   if( eType!=pPtr
5ca0: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67  map[offset] || g
5cb0: 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  et4byte(&pPtrmap
5cc0: 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72  [offset+1])!=par
5cd0: 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45  ent ){.    TRACE
5ce0: 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45  (("PTRMAP_UPDATE
5cf0: 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22  : %d->(%d,%d)\n"
5d00: 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61  , key, eType, pa
5d10: 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d  rent));.    rc =
5d20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
5d30: 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
5d40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5d50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72  OK ){.      pPtr
5d60: 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54  map[offset] = eT
5d70: 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ype;.      put4b
5d80: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
5d90: 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b  set+1], parent);
5da0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
5db0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
5dc0: 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75  pDbPage);.  retu
5dd0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5de0: 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72  Read an entry fr
5df0: 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  om the pointer m
5e00: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
5e10: 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65 73  outine retrieves
5e20: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
5e30: 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20   entry for page 
5e40: 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a  'key', writing.*
5e50: 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 70  * the type and p
5e60: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
5e70: 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64  r to *pEType and
5e80: 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69   *pPgno respecti
5e90: 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f  vely..** An erro
5ea0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
5eb0: 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20  ed if something 
5ec0: 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65  goes wrong, othe
5ed0: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
5ee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5ef0: 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72 65  trmapGet(BtShare
5f00: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
5f10: 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67  , u8 *pEType, Pg
5f20: 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62  no *pPgno){.  Db
5f30: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
5f40: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5f50: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  map page */.  in
5f60: 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20  t iPtrmap;      
5f70: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
5f80: 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  page index */.  
5f90: 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20  u8 *pPtrmap;    
5fa0: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
5fb0: 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  p page data */. 
5fc0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
5fd0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
5fe0: 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65   entry in pointe
5ff0: 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72  r map */.  int r
6000: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
6010: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6020: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
6030: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
6040: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
6050: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
6060: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
6070: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
6080: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
6090: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
60a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
60b0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
60c0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
60d0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
60e0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
60f0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
6100: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73  rmap, key);.  as
6110: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
6120: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
6130: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
6140: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
6150: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
6160: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
6170: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
6180: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
6190: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
61a0: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
61b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
61c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
61d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
61e0: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
61f0: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
6200: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
6210: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
6220: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29  rmapPut(w,x,y,z)
6230: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
6240: 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77  fine ptrmapGet(w
6250: 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f  ,x,y,z) SQLITE_O
6260: 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d  K.  #define ptrm
6270: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20  apPutOvflPtr(x, 
6280: 79 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  y) SQLITE_OK.#en
6290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
62a0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
62b0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
62c0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
62d0: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
62e0: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
62f0: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
6300: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
6310: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
6320: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
6330: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
6340: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
6350: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
6360: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
6370: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
6380: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
6390: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
63a0: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
63b0: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
63c0: 65 74 32 62 79 74 65 28 26 28 50 29 2d 3e 61 44  et2byte(&(P)->aD
63d0: 61 74 61 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66  ata[(P)->cellOff
63e0: 73 65 74 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f  set+2*(I)])))../
63f0: 2a 0a 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65  *.** This a more
6400: 20 63 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e   complex version
6410: 20 6f 66 20 66 69 6e 64 43 65 6c 6c 28 29 20 74   of findCell() t
6420: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
6430: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 63   pages that do c
6440: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
6450: 63 65 6c 6c 73 2e 20 20 53 65 65 20 69 6e 73 65  cells.  See inse
6460: 72 74 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  rt.*/.static u8 
6470: 2a 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  *findOverflowCel
6480: 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
6490: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
64a0: 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
64b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
64c0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
64d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
64e0: 69 3d 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  i=pPage->nOverfl
64f0: 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ow-1; i>=0; i--)
6500: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
6510: 20 73 74 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c   struct _OvflCel
6520: 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f  l *pOvfl;.    pO
6530: 76 66 6c 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f  vfl = &pPage->aO
6540: 76 66 6c 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20  vfl[i];.    k = 
6550: 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20  pOvfl->idx;.    
6560: 69 66 28 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a  if( k<=iCell ){.
6570: 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 69 43 65        if( k==iCe
6580: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ll ){.        re
6590: 74 75 72 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c  turn pOvfl->pCel
65a0: 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
65b0: 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a   iCell--;.    }.
65c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 69 6e    }.  return fin
65d0: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
65e0: 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ll);.}../*.** Pa
65f0: 72 73 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65  rse a cell conte
6600: 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c  nt block and fil
6610: 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66  l in the CellInf
6620: 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
6630: 65 72 65 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76  ere.** are two v
6640: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20  ersions of this 
6650: 66 75 6e 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74  function.  sqlit
6660: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
6670: 28 29 20 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63  () takes a .** c
6680: 65 6c 6c 20 69 6e 64 65 78 20 61 73 20 74 68 65  ell index as the
6690: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
66a0: 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72 65   and sqlite3Btre
66b0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
66c0: 0a 2a 2a 20 74 61 6b 65 73 20 61 20 70 6f 69 6e  .** takes a poin
66d0: 74 65 72 20 74 6f 20 74 68 65 20 62 6f 64 79 20  ter to the body 
66e0: 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 73 20 69  of the cell as i
66f0: 74 73 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ts second argume
6700: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e  nt..**.** Within
6710: 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 20   this file, the 
6720: 70 61 72 73 65 43 65 6c 6c 28 29 20 6d 61 63 72  parseCell() macr
6730: 6f 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  o can be called 
6740: 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71  instead of.** sq
6750: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
6760: 65 6c 6c 50 74 72 28 29 2e 20 55 73 69 6e 67 20  ellPtr(). Using 
6770: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20  some compilers, 
6780: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 66 61 73  this will be fas
6790: 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ter..*/.void sql
67a0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
67b0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
67c0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
67d0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
67e0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
67f0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
6800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
6810: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
6820: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
6830: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
6840: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
6850: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
6860: 0a 29 7b 0a 20 20 75 31 36 20 6e 3b 20 20 20 20  .){.  u16 n;    
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6880: 20 4e 75 6d 62 65 72 20 62 79 74 65 73 20 69 6e   Number bytes in
6890: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65   cell content he
68a0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50  ader */.  u32 nP
68b0: 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20  ayload;         
68c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
68d0: 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79  ytes of cell pay
68e0: 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  load */..  asser
68f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
6900: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
6910: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 70  ->mutex) );..  p
6920: 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43  Info->pCell = pC
6930: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ell;.  assert( p
6940: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c  Page->leaf==0 ||
6950: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20   pPage->leaf==1 
6960: 29 3b 0a 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e  );.  n = pPage->
6970: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
6980: 61 73 73 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70  assert( n==4-4*p
6990: 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20  Page->leaf );.  
69a0: 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
69b0: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  y ){.    if( pPa
69c0: 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
69d0: 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72       n += getVar
69e0: 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c  int32(&pCell[n],
69f0: 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20   nPayload);.    
6a00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
6a10: 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d  yload = 0;.    }
6a20: 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72  .    n += getVar
6a30: 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28  int(&pCell[n], (
6a40: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
6a50: 79 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  y);.    pInfo->n
6a60: 44 61 74 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Data = nPayload;
6a70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
6a80: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a  nfo->nData = 0;.
6a90: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
6aa0: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
6ab0: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70  nPayload);.    p
6ac0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
6ad0: 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e  yload;.  }.  pIn
6ae0: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
6af0: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
6b00: 2d 3e 6e 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20  ->nHeader = n;. 
6b10: 20 69 66 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79   if( likely(nPay
6b20: 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
6b30: 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a  Local) ){.    /*
6b40: 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65 61   This is the (ea
6b50: 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  sy) common case 
6b60: 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72 65  where the entire
6b70: 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20   payload fits.  
6b80: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61    ** on the loca
6b90: 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72  l page.  No over
6ba0: 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65 64  flow is required
6bb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
6bc0: 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
6bd0: 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
6be0: 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  f cell content i
6bf0: 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e  n bytes */.    n
6c00: 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20  Size = nPayload 
6c10: 2b 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  + n;.    pInfo->
6c20: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
6c30: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66  ayload;.    pInf
6c40: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30  o->iOverflow = 0
6c50: 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a 65  ;.    if( (nSize
6c60: 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20   & ~3)==0 ){.   
6c70: 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20     nSize = 4;   
6c80: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
6c90: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
6ca0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66  /.    }.    pInf
6cb0: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36 29  o->nSize = (u16)
6cc0: 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  nSize;.  }else{.
6cd0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
6ce0: 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66  yload will not f
6cf0: 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e  it completely on
6d00: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c   the local page,
6d10: 20 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20   we have.    ** 
6d20: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
6d30: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
6d40: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
6d50: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
6d60: 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
6d70: 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74  ages.  The strat
6d80: 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69  egy is to minimi
6d90: 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ze the amount of
6da0: 20 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73   unused.    ** s
6db0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
6dc0: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
6dd0: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
6de0: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
6df0: 0a 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65  .    ** in betwe
6e00: 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20  en minLocal and 
6e10: 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a  maxLocal..    **
6e20: 0a 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a  .    ** Warning:
6e30: 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77    changing the w
6e40: 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c  ay overflow payl
6e50: 6f 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74  oad is distribut
6e60: 65 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a  ed in any.    **
6e70: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
6e80: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
6e90: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
6ea0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
6eb0: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
6ec0: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
6ed0: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
6ee0: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
6ef0: 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61  maxLocal;  /* Ma
6f00: 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
6f10: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
6f20: 61 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ally */.    int 
6f30: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
6f40: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
6f50: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
6f60: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
6f70: 20 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50     minLocal = pP
6f80: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
6f90: 20 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50     maxLocal = pP
6fa0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
6fb0: 20 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e     surplus = min
6fc0: 4c 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61  Local + (nPayloa
6fd0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
6fe0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6ff0: 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
7000: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
7010: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7020: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
7030: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
7040: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7050: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
7060: 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  (u16)minLocal;. 
7070: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
7080: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28 75 31 36  iOverflow = (u16
7090: 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20  )(pInfo->nLocal 
70a0: 2b 20 6e 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  + n);.    pInfo-
70b0: 3e 6e 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e  >nSize = pInfo->
70c0: 69 4f 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20  iOverflow + 4;. 
70d0: 20 7d 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72   }.}.#define par
70e0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
70f0: 65 6c 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20  ell, pInfo) \.  
7100: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
7110: 65 43 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29  eCellPtr((pPage)
7120: 2c 20 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67  , findCell((pPag
7130: 65 29 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70  e), (iCell)), (p
7140: 49 6e 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69  Info)).void sqli
7150: 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
7160: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
7170: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
7180: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
7190: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
71a0: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
71b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
71c0: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
71d0: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
71e0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
71f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
7200: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
7210: 20 2a 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65   */.){.  parseCe
7220: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c  ll(pPage, iCell,
7230: 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pInfo);.}../*.*
7240: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
7250: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
7260: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
7270: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
7280: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
7290: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
72a0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
72b0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
72c0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
72d0: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
72e0: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
72f0: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
7300: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
7310: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
7320: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
7330: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63  .*/.static u16 c
7340: 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61  ellSizePtr(MemPa
7350: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
7360: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
7370: 65 72 20 3d 20 26 70 43 65 6c 6c 5b 70 50 61 67  er = &pCell[pPag
7380: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  e->childPtrSize]
7390: 3b 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 0a 0a  ;.  u32 nSize;..
73a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
73b0: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
73c0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
73d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
73e0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
73f0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
7400: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
7410: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
7420: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
7430: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
7440: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
7450: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
7460: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
7470: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
7480: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
7490: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
74a0: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
74b0: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
74c0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
74d0: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 73 71 6c  debuginfo;.  sql
74e0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
74f0: 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
7500: 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b  ll, &debuginfo);
7510: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
7520: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
7530: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 0a 20 20      u8 *pEnd;.  
7540: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
7550: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 49  Data ){.      pI
7560: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
7570: 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65 29  32(pIter, nSize)
7580: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7590: 20 20 20 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20     nSize = 0;.  
75a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 70 49 74 65    }..    /* pIte
75b0: 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20  r now points at 
75c0: 74 68 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67  the 64-bit integ
75d0: 65 72 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20  er key value, a 
75e0: 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20  variable length 
75f0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e  .    ** integer.
7600: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
7610: 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72  lock moves pIter
7620: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
7630: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 20 20   first byte.    
7640: 2a 2a 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ** past the end 
7650: 6f 66 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  of the key value
7660: 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20  . */.    pEnd = 
7670: 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77  &pIter[9];.    w
7680: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29  hile( (*pIter++)
7690: 26 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  &0x80 && pIter<p
76a0: 45 6e 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  End );.  }else{.
76b0: 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74      pIter += get
76c0: 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20  Varint32(pIter, 
76d0: 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 69  nSize);.  }..  i
76e0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
76f0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
7700: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
7710: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
7720: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
7730: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
7740: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
7750: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7760: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66  ize - 4);.    if
7770: 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d  ( nSize>pPage->m
7780: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  axLocal ){.     
7790: 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61   nSize = minLoca
77a0: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69  l;.    }.    nSi
77b0: 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 6e  ze += 4;.  }.  n
77c0: 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70 49  Size += (u32)(pI
77d0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 0a 20  ter - pCell);.. 
77e0: 20 2f 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20   /* The minimum 
77f0: 73 69 7a 65 20 6f 66 20 61 6e 79 20 63 65 6c 6c  size of any cell
7800: 20 69 73 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a   is 4 bytes. */.
7810: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
7820: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 0a  .    nSize = 4;.
7830: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
7840: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
7850: 6e 53 69 7a 65 20 29 3b 0a 20 20 72 65 74 75 72  nSize );.  retur
7860: 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a  n (u16)nSize;.}.
7870: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
7880: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
7890: 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ze(MemPage *pPag
78a0: 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20  e, int iCell){. 
78b0: 20 72 65 74 75 72 6e 20 63 65 6c 6c 53 69 7a 65   return cellSize
78c0: 50 74 72 28 70 50 61 67 65 2c 20 66 69 6e 64 43  Ptr(pPage, findC
78d0: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
78e0: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ));.}.#endif..#i
78f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7900: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
7910: 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 70  ** If the cell p
7920: 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70 61  Cell, part of pa
7930: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
7940: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
7950: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
7960: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
7970: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
7980: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
7990: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
79a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
79b0: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
79c0: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
79d0: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
79e0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
79f0: 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21 3d   assert( pCell!=
7a00: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  0 );.  sqlite3Bt
7a10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
7a20: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
7a30: 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
7a40: 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61  (info.nData+(pPa
7a50: 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66  ge->intKey?0:inf
7a60: 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e  o.nKey))==info.n
7a70: 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28  Payload );.  if(
7a80: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
7a90: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
7aa0: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
7ab0: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
7ac0: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
7ad0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
7ae0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
7af0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
7b00: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
7b10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7b20: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  OK;.}.#endif.../
7b30: 2a 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20  *.** Defragment 
7b40: 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20  the page given. 
7b50: 20 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d   All Cells are m
7b60: 6f 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65  oved to the.** e
7b70: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nd of the page a
7b80: 6e 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63  nd all free spac
7b90: 65 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69  e is collected i
7ba0: 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46  nto one.** big F
7bb0: 72 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75  reeBlk that occu
7bc0: 72 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  rs in between th
7bd0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c  e header and cel
7be0: 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72  l.** pointer arr
7bf0: 61 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20  ay and the cell 
7c00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2f  content area..*/
7c10: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72  .static int defr
7c20: 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61  agmentPage(MemPa
7c30: 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
7c40: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
7c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7c60: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
7c70: 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  t pc;           
7c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
7c90: 65 73 73 20 6f 66 20 61 20 69 2d 74 68 20 63 65  ess of a i-th ce
7ca0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  ll */.  int addr
7cb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7cc0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
7cd0: 66 69 72 73 74 20 62 79 74 65 20 61 66 74 65 72  first byte after
7ce0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
7cf0: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  ray */.  int hdr
7d00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7d10: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
7d20: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
7d30: 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20   */.  int size; 
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
7d60: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ll */.  int usab
7d70: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
7d80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7d90: 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20  usable bytes on 
7da0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  a page */.  int 
7db0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20  cellOffset;     
7dc0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
7dd0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69   to the cell poi
7de0: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
7df0: 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20  int cbrk;       
7e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
7e10: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
7e20: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
7e30: 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7e50: 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
7e60: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
7e70: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
7e80: 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20  *data;       /* 
7e90: 54 68 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f  The page data */
7ea0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7eb0: 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a   *temp;       /*
7ec0: 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63   Temp area for c
7ed0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  ell content */..
7ee0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7ef0: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
7f00: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
7f10: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7f20: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
7f30: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7f40: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
7f50: 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50   <= SQLITE_MAX_P
7f60: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73  AGE_SIZE );.  as
7f70: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
7f80: 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61  erflow==0 );.  a
7f90: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7fa0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
7fb0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
7fc0: 20 20 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33    temp = sqlite3
7fd0: 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
7fe0: 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65  Page->pBt->pPage
7ff0: 72 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  r);.  data = pPa
8000: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
8010: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
8020: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
8030: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
8040: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
8050: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
8060: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
8070: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
8080: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
8090: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
80a0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
80b0: 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32 62 79  .  cbrk = get2by
80c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
80d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70  ;.  memcpy(&temp
80e0: 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62  [cbrk], &data[cb
80f0: 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  rk], usableSize 
8100: 2d 20 63 62 72 6b 29 3b 0a 20 20 63 62 72 6b 20  - cbrk);.  cbrk 
8110: 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
8120: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
8130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
8140: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
8150: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
8160: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
8170: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
8180: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
8190: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
81a0: 64 64 72 29 3b 0a 20 20 20 20 69 66 28 20 70 63  ddr);.    if( pc
81b0: 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  >=usableSize ){.
81c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
81d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
81e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 69 7a 65  ;.    }.    size
81f0: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
8200: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
8210: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
8220: 7a 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b  ze;.    if( cbrk
8230: 3c 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  <cellOffset+2*nC
8240: 65 6c 6c 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  ell || pc+size>u
8250: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
8260: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8270: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
8280: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
8290: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
82a0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
82b0: 30 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  0 );.    memcpy(
82c0: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65  &data[cbrk], &te
82d0: 6d 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20  mp[pc], size);. 
82e0: 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64     put2byte(pAdd
82f0: 72 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20  r, cbrk);.  }.  
8300: 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65  assert( cbrk>=ce
8310: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
8320: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
8330: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
8340: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
8350: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
8360: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
8370: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61  [hdr+7] = 0;.  a
8380: 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  ddr = cellOffset
8390: 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73  +2*nCell;.  mems
83a0: 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20  et(&data[addr], 
83b0: 30 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 20  0, cbrk-addr);. 
83c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
83d0: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
83e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
83f0: 20 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 61   );.  if( cbrk-a
8400: 64 64 72 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ddr!=pPage->nFre
8410: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
8420: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8430: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
8440: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8450: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
8460: 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70  Byte bytes of sp
8470: 61 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ace from within 
8480: 74 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20  the B-Tree page 
8490: 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
84a0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
84b0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
84c0: 78 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44  x into pPage->aD
84d0: 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 0a 2a 2a  ata[] of the .**
84e0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
84f0: 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20  llocated space. 
8500: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
8510: 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61  r guarantees tha
8520: 74 20 74 68 65 20 73 70 61 63 65 20 62 65 74 77  t the space betw
8530: 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
8540: 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 0a  he cell-offset .
8550: 2a 2a 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  ** array and the
8560: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
8570: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
8580: 69 73 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74  is at least nByt
8590: 65 20 62 79 74 65 73 0a 2a 2a 20 69 6e 20 73 69  e bytes.** in si
85a0: 7a 65 2e 20 53 6f 20 74 68 69 73 20 72 6f 75 74  ze. So this rout
85b0: 69 6e 65 20 63 61 6e 20 6e 65 76 65 72 20 66 61  ine can never fa
85c0: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  il..**.** If the
85d0: 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 36  re are already 6
85e0: 30 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  0 or more bytes 
85f0: 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74  of fragments wit
8600: 68 69 6e 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a  hin the page,.**
8610: 20 74 68 65 20 70 61 67 65 20 69 73 20 64 65 66   the page is def
8620: 72 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65  ragmented before
8630: 20 72 65 74 75 72 6e 69 6e 67 2e 20 49 66 20 74   returning. If t
8640: 68 69 73 20 77 65 72 65 20 6e 6f 74 20 64 6f 6e  his were not don
8650: 65 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  e there.** is a 
8660: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 20  chance that the 
8670: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65  number of fragme
8680: 6e 74 65 64 20 62 79 74 65 73 20 63 6f 75 6c 64  nted bytes could
8690: 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
86a0: 6f 76 65 72 66 6c 6f 77 20 74 68 65 20 73 69 6e  overflow the sin
86b0: 67 6c 65 2d 62 79 74 65 20 66 69 65 6c 64 20 6f  gle-byte field o
86c0: 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  f the page-heade
86d0: 72 20 69 6e 20 77 68 69 63 68 20 74 68 69 73 20  r in which this 
86e0: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 74 6f 72  value.** is stor
86f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
8700: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
8710: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8720: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 63 6f  int nByte){.  co
8730: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
8740: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
8750: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
8760: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
8770: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
8780: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
8790: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
87a0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
87b0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
87c0: 2f 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b 20 20  /.  int nFrag;  
87d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
87f0: 65 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64  er of fragmented
8800: 20 62 79 74 65 73 20 6f 6e 20 70 50 61 67 65 20   bytes on pPage 
8810: 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20  */.  int top;.  
8820: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8830: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
8840: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
8850: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
8860: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
8870: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8880: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8890: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
88a0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
88b0: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
88c0: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
88d0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
88e0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
88f0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
8900: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
8910: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  ==0 );..  /* Ass
8920: 65 72 74 20 74 68 61 74 20 74 68 65 20 73 70 61  ert that the spa
8930: 63 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  ce between the c
8940: 65 6c 6c 2d 6f 66 66 73 65 74 20 61 72 72 61 79  ell-offset array
8950: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 63   and the .  ** c
8960: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
8970: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
8980: 20 6e 42 79 74 65 20 62 79 74 65 73 2e 0a 20 20   nByte bytes..  
8990: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  */.  assert( nBy
89a0: 74 65 20 3c 3d 20 28 0a 20 20 20 20 20 20 67 65  te <= (.      ge
89b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
89c0: 2b 35 5d 29 2d 28 68 64 72 2b 38 2b 28 70 50 61  +5])-(hdr+8+(pPa
89d0: 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 2b 32 2a  ge->leaf?0:4)+2*
89e0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
89f0: 64 72 2b 33 5d 29 29 0a 20 20 29 29 3b 0a 0a 20  dr+3])).  ));.. 
8a00: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
8a10: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
8a20: 67 3e 3d 36 30 20 29 7b 0a 20 20 20 20 64 65 66  g>=60 ){.    def
8a30: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
8a40: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
8a50: 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20 66   /* Search the f
8a60: 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20  reelist looking 
8a70: 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74 20  for a free slot 
8a80: 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73 61  big enough to sa
8a90: 74 69 73 66 79 20 0a 20 20 20 20 2a 2a 20 74 68  tisfy .    ** th
8aa0: 65 20 72 65 71 75 65 73 74 2e 20 54 68 65 20 61  e request. The a
8ab0: 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6d 61 64  llocation is mad
8ac0: 65 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74  e from the first
8ad0: 20 66 72 65 65 20 73 6c 6f 74 20 69 6e 20 0a 20   free slot in . 
8ae0: 20 20 20 2a 2a 20 74 68 65 20 6c 69 73 74 20 74     ** the list t
8af0: 68 61 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  hat is large eno
8b00: 75 67 68 20 74 6f 20 61 63 63 6f 6d 61 64 61 74  ugh to accomadat
8b10: 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  e it..    */.   
8b20: 20 69 6e 74 20 70 63 2c 20 61 64 64 72 3b 0a 20   int pc, addr;. 
8b30: 20 20 20 66 6f 72 28 61 64 64 72 3d 68 64 72 2b     for(addr=hdr+
8b40: 31 3b 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  1; (pc = get2byt
8b50: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
8b60: 30 3b 20 61 64 64 72 3d 70 63 29 7b 0a 20 20 20  0; addr=pc){.   
8b70: 20 20 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65     int size = ge
8b80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
8b90: 32 5d 29 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  2]);     /* Size
8ba0: 20 6f 66 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f   of free slot */
8bb0: 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e  .      if( size>
8bc0: 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  =nByte ){.      
8bd0: 20 20 69 6e 74 20 78 20 3d 20 73 69 7a 65 20 2d    int x = size -
8be0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
8bf0: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
8c00: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
8c10: 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65  he slot from the
8c20: 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61   free-list. Upda
8c30: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
8c40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 72  .          ** fr
8c50: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77  agmented bytes w
8c60: 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20  ithin the page. 
8c70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
8c80: 63 70 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c  cpy(&data[addr],
8c90: 20 26 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a   &data[pc], 2);.
8ca0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 5b 68            data[h
8cb0: 64 72 2b 37 5d 20 3d 20 28 75 38 29 28 6e 46 72  dr+7] = (u8)(nFr
8cc0: 61 67 20 2b 20 78 29 3b 0a 20 20 20 20 20 20 20  ag + x);.       
8cd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8ce0: 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65    /* The slot re
8cf0: 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65  mains on the fre
8d00: 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69  e-list. Reduce i
8d10: 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75  ts size to accou
8d20: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nt.          ** 
8d30: 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e 20  for the portion 
8d40: 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77 20  used by the new 
8d50: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  allocation. */. 
8d60: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
8d70: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 78  e(&data[pc+2], x
8d80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8d90: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b       return pc +
8da0: 20 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   x;.      }.    
8db0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
8dc0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
8dd0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
8de0: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
8df0: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
8e00: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
8e10: 74 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a  tent area..  */.
8e20: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
8e30: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2d  (&data[hdr+5]) -
8e40: 20 6e 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79   nByte;.  put2by
8e50: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
8e60: 20 74 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20   top);.  return 
8e70: 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  top;.}../*.** Re
8e80: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
8e90: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
8ea0: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
8eb0: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
8ec0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
8ed0: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
8ee0: 50 61 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72  Page->aDisk[star
8ef0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
8f00: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
8f10: 69 73 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e  is "size" bytes.
8f20: 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74  .**.** Most of t
8f30: 68 65 20 65 66 66 6f 72 74 20 68 65 72 65 20 69  he effort here i
8f40: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f  s involved in co
8f50: 61 6c 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74  alesing adjacent
8f60: 0a 2a 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20  .** free blocks 
8f70: 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69  into a single bi
8f80: 67 20 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f  g free block..*/
8f90: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
8fa0: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
8fb0: 50 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c  Page, int start,
8fc0: 20 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e   int size){.  in
8fd0: 74 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20  t addr, pbegin, 
8fe0: 68 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  hdr;.  unsigned 
8ff0: 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61  char *data = pPa
9000: 67 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73  ge->aData;..  as
9010: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
9020: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9030: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
9040: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
9050: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
9060: 73 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61  sert( start>=pPa
9070: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
9080: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
9090: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
90a0: 73 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70  start + size)<=p
90b0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
90c0: 65 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  eSize );.  asser
90d0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
90e0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
90f0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9100: 73 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b  sert( size>=0 );
9110: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
9120: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
9130: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
9140: 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
9150: 2a 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65  * Overwrite dele
9160: 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
9170: 77 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20  with zeros when 
9180: 74 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54  the SECURE_DELET
9190: 45 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  E .  ** option i
91a0: 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d  s enabled at com
91b0: 70 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d  pile-time */.  m
91c0: 65 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72  emset(&data[star
91d0: 74 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65  t], 0, size);.#e
91e0: 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
91f0: 68 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e  he space back in
9200: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
9210: 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73  st of freeblocks
9220: 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67   */.  hdr = pPag
9230: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
9240: 61 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a  addr = hdr + 1;.
9250: 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e    while( (pbegin
9260: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
9270: 61 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20  a[addr]))<start 
9280: 26 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20  && pbegin>0 ){. 
9290: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
92a0: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
92b0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
92c0: 20 20 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61     if( pbegin<=a
92d0: 64 64 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65  ddr ) {.      re
92e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
92f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
9300: 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69      addr = pbegi
9310: 6e 3b 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62  n;.  }.  if ( pb
9320: 65 67 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d  egin>pPage->pBt-
9330: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20  >usableSize-4 ) 
9340: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9350: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
9360: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
9370: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
9380: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
9390: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
93a0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
93b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
93c0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
93d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
93e0: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
93f0: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
9400: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 20   pPage->nFree + 
9410: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
9420: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
9430: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
9440: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
9450: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
9460: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
9470: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
9480: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
9490: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
94a0: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
94b0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
94c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
94d0: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
94e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
94f0: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
9500: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
9510: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
9520: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
9530: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
9540: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
9550: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
9560: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
9570: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
9580: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
9590: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
95a0: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
95b0: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
95c0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
95d0: 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t+7]) ){.       
95e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
95f0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
9600: 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b     }.      data[
9610: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9620: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
9630: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
9640: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
9650: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
9660: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
9670: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
9680: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
9690: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
96a0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
96b0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
96c0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
96d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
96e0: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
96f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
9700: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
9710: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
9720: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
9730: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
9740: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
9750: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
9760: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
9770: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
9780: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
9790: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
97a0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
97b0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
97c0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
97d0: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
97e0: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
97f0: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
9800: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
9810: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
9820: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9830: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
9840: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
9850: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
9860: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
9870: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
9880: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
9890: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
98a0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
98b0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
98c0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
98d0: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
98e0: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
98f0: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
9900: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
9910: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
9920: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
9930: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
9940: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
9950: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
9960: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
9970: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
9980: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
9990: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
99a0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
99b0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
99c0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
99d0: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
99e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
99f0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
9a00: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
9a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
9a20: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
9a30: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
9a40: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
9a50: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
9a60: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
9a70: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
9a80: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
9a90: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
9aa0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
9ab0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
9ac0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9ad0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
9ae0: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
9af0: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
9b00: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
9b10: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
9b20: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
9b30: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
9b40: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
9b50: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
9b60: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
9b70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
9b80: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
9b90: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
9ba0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
9bb0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
9bc0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
9bd0: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
9be0: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
9bf0: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
9c00: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
9c10: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
9c20: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
9c30: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
9c40: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
9c50: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
9c60: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
9c70: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
9c80: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
9c90: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
9ca0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
9cb0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
9cc0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
9cd0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
9ce0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9cf0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
9d00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
9d10: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
9d20: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
9d30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
9d40: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
9d50: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
9d60: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
9d70: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
9d80: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
9d90: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
9da0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
9db0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
9dc0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
9dd0: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
9de0: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
9df0: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
9e00: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
9e10: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
9e20: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
9e30: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
9e40: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
9e50: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
9e60: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
9e70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
9e80: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
9e90: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
9ea0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
9eb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
9ec0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9ed0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9ee0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9ef0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
9f00: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
9f10: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
9f20: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
9f30: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
9f40: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
9f50: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9f60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9f70: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
9f80: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
9f90: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
9fa0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
9fb0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
9fc0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
9fd0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
9fe0: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
9ff0: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
a000: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
a010: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
a020: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
a030: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
a040: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
a050: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
a060: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
a070: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
a080: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
a090: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
a0a0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
a0b0: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
a0c0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
a0d0: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
a0e0: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
a0f0: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
a100: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
a110: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
a120: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
a130: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
a140: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
a150: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a160: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
a170: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
a180: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
a190: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
a1a0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
a1b0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
a1c0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
a1d0: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
a1e0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
a1f0: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
a200: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
a210: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
a220: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
a230: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
a240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
a250: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
a260: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
a270: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
a280: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
a290: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
a2a0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
a2b0: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
a2c0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
a2d0: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
a2e0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
a2f0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
a300: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
a310: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
a320: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
a330: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
a340: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
a350: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
a360: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
a370: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
a380: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
a390: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
a3a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
a3b0: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
a3c0: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
a3d0: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
a3e0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
a3f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
a400: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
a410: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 66  }..    /* A malf
a420: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
a430: 61 67 65 20 6d 69 67 68 74 20 63 61 75 73 65 20  age might cause 
a440: 75 73 65 20 74 6f 20 72 65 61 64 20 70 61 73 74  use to read past
a450: 20 74 68 65 20 65 6e 64 0a 20 20 20 20 2a 2a 20   the end.    ** 
a460: 6f 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72  of page when par
a470: 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20  sing a cell.  . 
a480: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
a490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
a4a0: 20 6f 66 20 63 6f 64 65 20 63 68 65 63 6b 73 20   of code checks 
a4b0: 65 61 72 6c 79 20 74 6f 20 73 65 65 20 69 66 20  early to see if 
a4c0: 61 20 63 65 6c 6c 20 65 78 74 65 6e 64 73 0a 20  a cell extends. 
a4d0: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
a4e0: 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f 75  nd of a page bou
a4f0: 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65 73  ndary and causes
a500: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
a510: 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 72 65  to be .    ** re
a520: 74 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65  turned if it doe
a530: 73 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65  s..    */.#if de
a540: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
a550: 42 4c 45 5f 4f 56 45 52 53 49 5a 45 5f 43 45 4c  BLE_OVERSIZE_CEL
a560: 4c 5f 43 48 45 43 4b 29 0a 20 20 20 20 7b 0a 20  L_CHECK).    {. 
a570: 20 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69       int iCellFi
a580: 72 73 74 3b 20 20 20 2f 2a 20 46 69 72 73 74 20  rst;   /* First 
a590: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
a5a0: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ndex */.      in
a5b0: 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20  t iCellLast;    
a5c0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
a5d0: 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
a5e0: 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20       int i;     
a5f0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
a600: 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f  into the cell po
a610: 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20  inter array */. 
a620: 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20       int sz;    
a630: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
a640: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20  f a cell */..   
a650: 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20     iCellFirst = 
a660: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
a670: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
a680: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
a690: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
a6a0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
a6b0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
a6c0: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
a6d0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
a6e0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
a6f0: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
a700: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
a710: 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*2]);.        
a720: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
a730: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
a740: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  t ){.          r
a750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a760: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
a770: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20     }.        sz 
a780: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
a790: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
a7a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 2b  .        if( pc+
a7b0: 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  sz>usableSize ){
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
a7d0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a7e0: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
a7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 20  .      }.    }  
a800: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
a810: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
a820: 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e 20  l free space on 
a830: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
a840: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
a850: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
a860: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
a870: 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a 20 20 20 20  r+7] + top;.    
a880: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
a890: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
a8a0: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
a8b0: 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  c>usableSize-4 )
a8c0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
a8d0: 65 20 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  e block is off t
a8e0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  he page */.     
a8f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a900: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
a910: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
a920: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
a930: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
a940: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
a950: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
a960: 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20 26      if( next>0 &
a970: 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b  & next<=pc+size+
a980: 33 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  3 ){.        /* 
a990: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
a9a0: 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67   be in accending
a9b0: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20   order */.      
a9c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a9d0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
a9e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
a9f0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
aa00: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
aa10: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
aa20: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
aa30: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
aa40: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
aa50: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
aa60: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
aa70: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
aa80: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
aa90: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
aaa0: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
aab0: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
aac0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
aad0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
aae0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
aaf0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
ab00: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
ab10: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
ab20: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
ab30: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
ab40: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
ab50: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
ab60: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
ab70: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
ab80: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
ab90: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
aba0: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
abb0: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
abc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
abd0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
abe0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
abf0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
ac00: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
ac10: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65  ge->nFree = nFre
ac20: 65 20 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20  e - (cellOffset 
ac30: 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
ac40: 29 3b 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43  );..#if 0.  /* C
ac50: 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68  heck that all th
ac60: 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65  e offsets in the
ac70: 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72   cell offset arr
ac80: 61 79 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ay are within ra
ac90: 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a  nge. .  ** .  **
aca0: 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63   Omitting this c
acb0: 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b  onsistency check
acc0: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70   and using the p
acd0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d  Page->maskPage m
ace0: 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ask.  ** to prev
acf0: 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20  ent overrunning 
ad00: 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 20  the page buffer 
ad10: 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65  in findCell() re
ad20: 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20  sults in a.  ** 
ad30: 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65  2.5% performance
ad40: 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a   gain..  */.  {.
ad50: 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20      u8 *pOff;   
ad60: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
ad70: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61   used to check a
ad80: 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  ll cell offsets 
ad90: 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  are in range */.
ada0: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20      u8 *pEnd;   
adb0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
adc0: 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f  to end of cell o
add0: 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20  ffset array */. 
ade0: 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20     u8 mask;     
adf0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62      /* Mask of b
ae00: 69 74 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  its that must be
ae10: 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20   zero in MSB of 
ae20: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a  cell offsets */.
ae30: 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75      mask = ~(((u
ae40: 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
ae50: 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45  >>8))-1);.    pE
ae60: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
ae70: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
ae80: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72  Cell*2];.    for
ae90: 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c  (pOff=&data[cell
aea0: 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70  Offset]; pOff!=p
aeb0: 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29  End && !((*pOff)
aec0: 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29  &mask); pOff+=2)
aed0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d  ;.    if( pOff!=
aee0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65  pEnd ){.      re
aef0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
af00: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
af10: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
af20: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
af30: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
af40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
af50: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
af60: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
af70: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
af80: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
af90: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
afa0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
afb0: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
afc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
afd0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
afe0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
aff0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
b000: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
b010: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
b020: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
b030: 4f 66 66 73 65 74 3b 0a 20 20 75 31 36 20 66 69  Offset;.  u16 fi
b040: 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rst;..  assert( 
b050: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
b060: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
b070: 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70  bPage)==pPage->p
b080: 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
b090: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
b0a0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
b0b0: 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29  Page) == (void*)
b0c0: 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
b0d0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
b0e0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
b0f0: 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20 29  bPage) == data )
b100: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
b110: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
b120: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
b130: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
b140: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
b150: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
b160: 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26 64  );.  /*memset(&d
b170: 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74  ata[hdr], 0, pBt
b180: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68  ->usableSize - h
b190: 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68 64  dr);*/.  data[hd
b1a0: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
b1b0: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
b1c0: 2b 20 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26  + 8 + 4*((flags&
b1d0: 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 31 3a  PTF_LEAF)==0 ?1:
b1e0: 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  0);.  memset(&da
b1f0: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
b200: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
b210: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
b220: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
b230: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
b240: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
b250: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
b260: 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f   - first;.  deco
b270: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
b280: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
b290: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
b2a0: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
b2b0: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
b2c0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
b2d0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
b2e0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
b2f0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
b300: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
b310: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
b320: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
b330: 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  - 1;.  pPage->nC
b340: 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
b350: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
b360: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
b370: 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
b380: 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
b390: 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
b3a0: 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
b3b0: 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
b3c0: 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
b3d0: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
b3e0: 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
b3f0: 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
b400: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
b410: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
b420: 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
b430: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
b440: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
b450: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
b460: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
b470: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
b480: 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
b490: 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70  Page;.  pPage->p
b4a0: 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67  Bt = pBt;.  pPag
b4b0: 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  e->pgno = pgno;.
b4c0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
b4d0: 65 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  et = pPage->pgno
b4e0: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20  ==1 ? 100 : 0;. 
b4f0: 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
b500: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
b510: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
b520: 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
b530: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
b540: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
b550: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
b560: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   needed..**.** I
b570: 66 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  f the noContent 
b580: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20  flag is set, it 
b590: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
b5a0: 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a   not care about.
b5b0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ** the content o
b5c0: 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68  f the page at th
b5d0: 69 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20  is time.  So do 
b5e0: 6e 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69  not go to the di
b5f0: 73 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74  sk.** to fetch t
b600: 68 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73  he content.  Jus
b610: 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f  t fill in the co
b620: 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
b630: 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20   for now..** If 
b640: 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  in the future we
b650: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
b660: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69  erWrite() on thi
b670: 73 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20  s page, that.** 
b680: 6d 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74  means we have st
b690: 61 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63  arted to be conc
b6a0: 65 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74  erned about cont
b6b0: 65 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b  ent and the disk
b6c0: 0a 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20  .** read should 
b6d0: 6f 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f  occur at that po
b6e0: 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  int..*/.int sqli
b6f0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
b700: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b710: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62  ,       /* The b
b720: 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  tree */.  Pgno p
b730: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
b740: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
b750: 70 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f  page to fetch */
b760: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
b770: 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72  age,    /* Retur
b780: 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
b790: 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a  is parameter */.
b7a0: 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
b7b0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
b7c0: 20 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65   load page conte
b7d0: 6e 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  nt if true */.){
b7e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
b7f0: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20  age *pDbPage;.. 
b800: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b810: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
b820: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
b830: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  = sqlite3PagerAc
b840: 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65  quire(pBt->pPage
b850: 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
b860: 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f 43  **)&pDbPage, noC
b870: 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  ontent);.  if( r
b880: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
b890: 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
b8a0: 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
b8b0: 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
b8c0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
b8d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b8e0: 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
b8f0: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
b900: 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
b910: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
b920: 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
b930: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
b940: 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
b950: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
b960: 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
b970: 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
b980: 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
b990: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
b9a0: 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
b9b0: 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
b9c0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
b9d0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
b9e0: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
b9f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
ba00: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
ba10: 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
ba20: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
ba30: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
ba40: 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
ba50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
ba60: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
ba70: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
ba80: 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
ba90: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
baa0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
bab0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
bac0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
bad0: 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
bae0: 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
baf0: 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
bb00: 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
bb10: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 61 67 65  static Pgno page
bb20: 72 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  rPagecount(BtSha
bb30: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
bb40: 20 6e 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 69   nPage = -1;.  i
bb50: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
bb60: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29 3b 0a   pBt->pPage1 );.
bb70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
bb80: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
bb90: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
bba0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
bbb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6e 50  =SQLITE_OK || nP
bbc0: 61 67 65 3d 3d 2d 31 20 29 3b 0a 20 20 72 65 74  age==-1 );.  ret
bbd0: 75 72 6e 20 28 50 67 6e 6f 29 6e 50 61 67 65 3b  urn (Pgno)nPage;
bbe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  .}../*.** Get a 
bbf0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
bc00: 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ger and initiali
bc10: 7a 65 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ze it.  This rou
bc20: 74 69 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20  tine.** is just 
bc30: 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  a convenience wr
bc40: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70  apper around sep
bc50: 61 72 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  arate calls to.*
bc60: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  * sqlite3BtreeGe
bc70: 74 50 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69  tPage() and sqli
bc80: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
bc90: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
bca0: 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  t getAndInitPage
bcb0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
bcc0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  t,          /* T
bcd0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
bce0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c   */.  Pgno pgno,
bcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bd00: 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
bd10: 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
bd20: 50 61 67 65 20 2a 2a 70 70 50 61 67 65 20 20 20  Page **ppPage   
bd30: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
bd40: 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
bd50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
bd60: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
bd70: 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
bd80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
bd90: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
bda0: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b    if( pgno==0 ){
bdb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
bdc0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
bdd0: 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69   .  }..  /* It i
bde0: 73 20 6f 66 74 65 6e 20 74 68 65 20 63 61 73 65  s often the case
bdf0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 77   that the page w
be00: 65 20 77 61 6e 74 20 69 73 20 61 6c 72 65 61 64  e want is alread
be10: 79 20 69 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a  y in cache..  **
be20: 20 49 66 20 73 6f 2c 20 67 65 74 20 69 74 20 64   If so, get it d
be30: 69 72 65 63 74 6c 79 2e 20 20 54 68 69 73 20 73  irectly.  This s
be40: 61 76 65 73 20 75 73 20 66 72 6f 6d 20 68 61 76  aves us from hav
be50: 69 6e 67 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  ing to call.  **
be60: 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
be70: 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 70  ) to make sure p
be80: 67 6e 6f 20 69 73 20 77 69 74 68 69 6e 20 6c 69  gno is within li
be90: 6d 69 74 73 2c 20 77 68 69 63 68 20 72 65 73 75  mits, which resu
bea0: 6c 74 73 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65  lts.  ** in a me
beb0: 61 73 75 72 65 61 62 6c 65 20 70 65 72 66 6f 72  asureable perfor
bec0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
bed0: 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61  ts..  */.  *ppPa
bee0: 67 65 20 3d 20 70 50 61 67 65 20 3d 20 62 74 72  ge = pPage = btr
bef0: 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
bf00: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
bf10: 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 50  Page ){.    /* P
bf20: 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20 69  age is already i
bf30: 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 72  n cache */.    r
bf40: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
bf50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 50   }else{.    /* P
bf60: 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63 68 65  age not in cache
bf70: 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e 20 2a  .  Acquire it. *
bf80: 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70  /.    if( pgno>p
bf90: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
bfa0: 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
bfb0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
bfc0: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
bfd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
bfe0: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
bff0: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
c000: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
c010: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
c020: 50 61 67 65 20 3d 20 2a 70 70 50 61 67 65 3b 0a  Page = *ppPage;.
c030: 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
c040: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
c050: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
c060: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
c070: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
c080: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c090: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
c0a0: 67 65 29 3b 0a 20 20 20 20 2a 70 70 50 61 67 65  ge);.    *ppPage
c0b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
c0c0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c0d0: 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67  Release a MemPag
c0e0: 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20  e.  This should 
c0f0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  be called once f
c100: 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a  or each prior.**
c110: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c120: 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f  BtreeGetPage..*/
c130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
c140: 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65  easePage(MemPage
c150: 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28 20   *pPage){.  if( 
c160: 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73 73  pPage ){.    ass
c170: 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
c180: 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 73 71 6c 69  rflow==0 || sqli
c190: 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63  te3PagerPageRefc
c1a0: 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 44 62 50  ount(pPage->pDbP
c1b0: 61 67 65 29 3e 31 20 29 3b 0a 20 20 20 20 61 73  age)>1 );.    as
c1c0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
c1d0: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
c1e0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
c1f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c200: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
c210: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
c220: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
c230: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c240: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
c250: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
c260: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
c270: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
c280: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c290: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c2a0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
c2b0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
c2c0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
c2d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75  .  }.}../*.** Du
c2e0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  ring a rollback,
c2f0: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   when the pager 
c300: 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74  reloads informat
c310: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63  ion into the cac
c320: 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  he.** so that th
c330: 65 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  e cache is resto
c340: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
c350: 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74 68 65  nal state at the
c360: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65   start of.** the
c370: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f   transaction, fo
c380: 72 20 65 61 63 68 20 70 61 67 65 20 72 65 73 74  r each page rest
c390: 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e  ored this routin
c3a0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
c3b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c3c0: 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74 20 74  needs to reset t
c3d0: 68 65 20 65 78 74 72 61 20 64 61 74 61 20 73 65  he extra data se
c3e0: 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64  ction at the end
c3f0: 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   of the.** page 
c400: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
c410: 65 20 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e  e restored data.
c420: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c430: 70 61 67 65 52 65 69 6e 69 74 28 44 62 50 61 67  pageReinit(DbPag
c440: 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d  e *pData){.  Mem
c450: 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70  Page *pPage;.  p
c460: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
c470: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
c480: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
c490: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
c4a0: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
c4b0: 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20  t(pData)>0 );.  
c4c0: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
c4d0: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
c4e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c4f0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c500: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50  mutex) );.    pP
c510: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b  age->isInit = 0;
c520: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c530: 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
c540: 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20  t(pData)>1 ){.  
c550: 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67      /* pPage mig
c560: 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65  ht not be a btre
c570: 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68  e page;  it migh
c580: 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  t be an overflow
c590: 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f   page.      ** o
c5a0: 72 20 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72  r ptrmap page or
c5b0: 20 61 20 66 72 65 65 20 70 61 67 65 2e 20 20 49   a free page.  I
c5c0: 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74  n those cases, t
c5d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
c5e0: 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71     ** call to sq
c5f0: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
c600: 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ge() will likely
c610: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c620: 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a  ORRUPT..      **
c630: 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20   But no harm is 
c640: 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41  done by this.  A
c650: 6e 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d  nd it is very im
c660: 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20  portant that.   
c670: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
c680: 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
c690: 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
c6a0: 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
c6b0: 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
c6c0: 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
c6d0: 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
c6e0: 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
c6f0: 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ing. */.      sq
c700: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
c710: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
c720: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
c730: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
c740: 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
c750: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c760: 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
c770: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
c780: 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
c790: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
c7a0: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
c7b0: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
c7c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
c7d0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
c7e0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
c7f0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
c800: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
c810: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
c820: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
c830: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
c840: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
c850: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
c860: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
c870: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
c880: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
c890: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
c8a0: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
c8b0: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
c8c0: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
c8d0: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
c8e0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
c8f0: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
c900: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
c910: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20  s called..** If 
c920: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
c930: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
c940: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
c950: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
c960: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
c970: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
c980: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
c990: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
c9a0: 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
c9b0: 65 61 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74  eady opened in t
c9c0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
c9d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61   connection.** a
c9e0: 6e 64 20 77 65 20 61 72 65 20 69 6e 20 73 68 61  nd we are in sha
c9f0: 72 65 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20  red cache mode, 
ca00: 74 68 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69  then the open wi
ca10: 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a  ll fail with an.
ca20: 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  ** SQLITE_CONSTR
ca30: 41 49 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20  AINT error.  We 
ca40: 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f  cannot allow two
ca50: 20 6f 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65   or more BtShare
ca60: 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20  d.** objects in 
ca70: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
ca80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e  e connection sin
ca90: 63 65 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c  ce doing so will
caa0: 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62   lead.** to prob
cab0: 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e  lems with lockin
cac0: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
cad0: 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f  3BtreeOpen(.  co
cae0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
caf0: 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
cb00: 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69   the file contai
cb10: 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20 64  ning the BTree d
cb20: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c  atabase */.  sql
cb30: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
cb40: 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74       /* Associat
cb50: 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ed database hand
cb60: 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a  le */.  Btree **
cb70: 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20  ppBtree,        
cb80: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
cb90: 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77  w Btree object w
cba0: 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20  ritten here */. 
cbb0: 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
cbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69           /* Opti
cbd0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ons */.  int vfs
cbe0: 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
cbf0: 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
cc00: 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69   through to sqli
cc10: 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20  te3_vfs.xOpen() 
cc20: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
cc30: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
cc40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
cc50: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
cc60: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
cc70: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
cc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
cc90: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
cca0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
ccb0: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
cce0: 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
ccf0: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
cd00: 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
cd10: 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
cd20: 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
cd30: 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
cd40: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
cd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
cd60: 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
cd70: 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
cd80: 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
cd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cda0: 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
cdb0: 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
cdc0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
cdd0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
cde0: 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
cdf0: 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
ce00: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 53 65 74 20  nt */..  /* Set 
ce10: 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d  the variable isM
ce20: 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72  emdb to true for
ce30: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
ce40: 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a  tabase, or .  **
ce50: 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c   false for a fil
ce60: 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65  e-based database
ce70: 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69 73  . This symbol is
ce80: 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20 69   only required i
ce90: 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 66  f.  ** either of
cea0: 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74 61   the shared-data
ceb0: 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20 66   or autovacuum f
cec0: 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d 70  eatures are comp
ced0: 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f 20  iled .  ** into 
cee0: 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20 2a  the library..  *
cef0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
cf00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
cf10: 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65 66  D_CACHE) || !def
cf20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
cf30: 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20 23  _AUTOVACUUM).  #
cf40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
cf50: 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 63  T_MEMORYDB.    c
cf60: 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
cf70: 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20 20   = 0;.  #else.  
cf80: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
cf90: 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 20  mdb = zFilename 
cfa0: 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c 65  && !strcmp(zFile
cfb0: 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
cfc0: 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e 64  );.  #endif.#end
cfd0: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
cfe0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
cff0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d000: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
d010: 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d 3e  ;..  pVfs = db->
d020: 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c 69  pVfs;.  p = sqli
d030: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
d040: 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
d050: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
d060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
d070: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  M;.  }.  p->inTr
d080: 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
d090: 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
d0a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
d0b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
d0c0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
d0d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
d0e0: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
d0f0: 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
d100: 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
d110: 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
d120: 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
d130: 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
d140: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
d150: 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
d160: 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
d170: 69 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46  isMemdb==0 && zF
d180: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
d190: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69  name[0] ){.    i
d1a0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
d1b0: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
d1c0: 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
d1d0: 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68     int nFullPath
d1e0: 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50  name = pVfs->mxP
d1f0: 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20  athname+1;.     
d200: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
d210: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
d220: 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61  lloc(nFullPathna
d230: 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
d240: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
d250: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e  hared;.      p->
d260: 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
d270: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
d280: 20 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61   SQLITE_SharedCa
d290: 63 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21  che;.      if( !
d2a0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
d2b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d2c0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
d2d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d2e0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
d2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75       sqlite3OsFu
d300: 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
d310: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c   zFilename, nFul
d320: 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c  lPathname, zFull
d330: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
d340: 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
d350: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
d360: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
d370: 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
d380: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d390: 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
d3a0: 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
d3b0: 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
d3c0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
d3d0: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
d3e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d3f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
d400: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
d410: 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28   for(pBt=GLOBAL(
d420: 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
d430: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
d440: 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d  ); pBt; pBt=pBt-
d450: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
d460: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52   assert( pBt->nR
d470: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ef>0 );.        
d480: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46  if( 0==strcmp(zF
d490: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c  ullPathname, sql
d4a0: 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
d4b0: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a  e(pBt->pPager)).
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
d4e0: 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Vfs(pBt->pPager)
d4f0: 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20  ==pVfs ){.      
d500: 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20      int iDb;.   
d510: 20 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64         for(iDb=d
d520: 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30  b->nDb-1; iDb>=0
d530: 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20  ; iDb--){.      
d540: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78        Btree *pEx
d550: 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62  isting = db->aDb
d560: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20  [iDb].pBt;.     
d570: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73         if( pExis
d580: 74 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e  ting && pExistin
d590: 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20  g->pBt==pBt ){. 
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d5b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d5c0: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
d5e0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d5f0: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
d600: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
d610: 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
d620: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
d630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
d640: 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ee(p);.         
d650: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d660: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20  TE_CONSTRAINT;. 
d670: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
d680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d690: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
d6b0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
d6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
d6d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d6e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d6f0: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
d700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d710: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
d720: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
d730: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
d740: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
d750: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
d760: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
d770: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
d780: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
d790: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
d7a0: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
d7b0: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
d7c0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
d7d0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
d7e0: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
d7f0: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
d800: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
d810: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
d820: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
d830: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
d840: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
d850: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
d860: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
d870: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
d880: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
d890: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
d8a0: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
d8b0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
d8c0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
d8d0: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
d8e0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
d8f0: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
d900: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
d910: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
d920: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
d930: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
d940: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
d950: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
d960: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
d970: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
d980: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
d990: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
d9a0: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
d9b0: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
d9c0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
d9d0: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
d9e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
d9f0: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
da00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
da10: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
da20: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
da30: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
da40: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
da50: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
da60: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
da70: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
da80: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
da90: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
daa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
dab0: 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
dac0: 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
dad0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
daf0: 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73  XTRA_SIZE, flags
db00: 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20  , vfsFlags);.   
db10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
db20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
db30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
db40: 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
db50: 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
db60: 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
db70: 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
db80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
db90: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
dba0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
dbb0: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64      }.    pBt->d
dbc0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
dbd0: 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68  te3PagerSetBusyh
dbe0: 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
dbf0: 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
dc00: 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
dc10: 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
dc20: 42 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74  Bt;.  .    sqlit
dc30: 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
dc40: 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  er(pBt->pPager, 
dc50: 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20  pageReinit);.   
dc60: 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
dc70: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
dc80: 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  e1 = 0;.    pBt-
dc90: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69  >readOnly = sqli
dca0: 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
dcb0: 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ly(pBt->pPager);
dcc0: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
dcd0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a  ze = get2byte(&z
dce0: 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20  DbHeader[16]);. 
dcf0: 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
dd00: 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
dd10: 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
dd20: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
dd30: 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
dd40: 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
dd50: 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
dd60: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
dd70: 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
dd80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dd90: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
dda0: 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
ddb0: 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
ddc0: 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
ddd0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
dde0: 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
ddf0: 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
de00: 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
de10: 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
de20: 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
de30: 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
de40: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
de50: 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
de60: 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
de70: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
de80: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
de90: 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
dea0: 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
deb0: 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
dec0: 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
ded0: 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
dee0: 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
def0: 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
df00: 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
df10: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
df20: 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
df30: 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
df40: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
df50: 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
df60: 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
df70: 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
df80: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
df90: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
dfa0: 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
dfb0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
dfc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
dfd0: 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
dfe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73  else{.      nRes
dff0: 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
e000: 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
e010: 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d  >pageSizeFixed =
e020: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
e030: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
e040: 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
e050: 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
e060: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
e070: 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
e080: 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
e090: 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
e0a0: 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
e0b0: 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
e0c0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
e0d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
e0e0: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
e0f0: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
e100: 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
e110: 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
e120: 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
e130: 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
e140: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
e150: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
e160: 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
e170: 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
e180: 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
e190: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
e1a0: 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
e1b0: 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
e1c0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
e1d0: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
e1e0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e1f0: 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
e200: 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
e210: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
e220: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
e230: 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
e240: 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
e250: 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
e260: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
e270: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
e280: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d  ared;.      pBt-
e290: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20  >nRef = 1;.     
e2a0: 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
e2b0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
e2c0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
e2d0: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
e2e0: 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54      if( SQLITE_T
e2f0: 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c  HREADSAFE && sql
e300: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
e310: 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20  .bCoreMutex ){. 
e320: 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65         pBt->mute
e330: 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  x = sqlite3Mutex
e340: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
e350: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
e360: 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78    if( pBt->mutex
e370: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e380: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
e390: 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62  EM;.          db
e3a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
e3b0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   0;.          go
e3c0: 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
e3d0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
e3e0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
e3f0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
e400: 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
e410: 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20     pBt->pNext = 
e420: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
e430: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
e440: 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
e450: 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
e460: 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
e470: 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a  cheList) = pBt;.
e480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
e490: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
e4a0: 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65  hared);.    }.#e
e4b0: 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64  ndif.  }..#if !d
e4c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e4d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
e4e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
e4f0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
e500: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77  .  /* If the new
e510: 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68   Btree uses a sh
e520: 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64  arable pBtShared
e530: 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20  , then link the 
e540: 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69  new.  ** Btree i
e550: 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20  nto the list of 
e560: 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72  all sharable Btr
e570: 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65  ees for the same
e580: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a   connection..  *
e590: 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65  * The list is ke
e5a0: 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  pt in ascending 
e5b0: 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64  order by pBt add
e5c0: 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ress..  */.  if(
e5d0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
e5e0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42      int i;.    B
e5f0: 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20  tree *pSib;.    
e600: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
e610: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
e620: 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e  if( (pSib = db->
e630: 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26  aDb[i].pBt)!=0 &
e640: 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65  & pSib->sharable
e650: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
e660: 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29  e( pSib->pPrev )
e670: 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70  { pSib = pSib->p
e680: 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20  Prev; }.        
e690: 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d  if( p->pBt<pSib-
e6a0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
e6b0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
e6c0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
e6d0: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
e6e0: 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
e6f0: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
e700: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
e710: 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
e720: 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74  t && pSib->pNext
e730: 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a  ->pBt<p->pBt ){.
e740: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62              pSib
e750: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
e760: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e770: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
e780: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
e790: 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
e7a0: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
e7b0: 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20     if( p->pNext 
e7c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
e7d0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
e7e0: 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   p;.          }.
e7f0: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e            pSib->
e800: 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20  pNext = p;.     
e810: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
e820: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
e830: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a  }.  }.#endif.  *
e840: 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74  ppBtree = p;..bt
e850: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20  ree_open_out:.  
e860: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
e870: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74  K ){.    if( pBt
e880: 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20   && pBt->pPager 
e890: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e8a0: 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e  PagerClose(pBt->
e8b0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
e8c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
e8d0: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
e8e0: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a  3_free(p);.    *
e8f0: 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ppBtree = 0;.  }
e900: 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
e910: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e920: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e930: 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
e940: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
e950: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
e960: 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  en);.  }.  retur
e970: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
e980: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53  ecrement the BtS
e990: 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
e9a0: 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61  er.  When it rea
e9b0: 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65  ches zero,.** re
e9c0: 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65  move the BtShare
e9d0: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d  d structure from
e9e0: 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73   the sharing lis
e9f0: 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  t.  Return.** tr
ea00: 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72  ue if the BtShar
ea10: 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20  ed.nRef counter 
ea20: 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64  reaches zero and
ea30: 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65   return.** false
ea40: 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20   if it is still 
ea50: 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  positive..*/.sta
ea60: 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72  tic int removeFr
ea70: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74  omSharingList(Bt
ea80: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69  Shared *pBt){.#i
ea90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eaa0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
eab0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
eac0: 70 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61  pMaster;.  BtSha
ead0: 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
eae0: 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
eaf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
eb00: 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
eb10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
eb20: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
eb30: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
eb40: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
eb50: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
eb60: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
eb70: 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d  pMaster);.  pBt-
eb80: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
eb90: 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20  Bt->nRef<=0 ){. 
eba0: 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74     if( GLOBAL(Bt
ebb0: 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
ebc0: 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d  haredCacheList)=
ebd0: 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c  =pBt ){.      GL
ebe0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
ebf0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
ec00: 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e  eList) = pBt->pN
ec10: 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
ec20: 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c        pList = GL
ec30: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
ec40: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
ec50: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68  eList);.      wh
ec60: 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73  ile( ALWAYS(pLis
ec70: 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65  t) && pList->pNe
ec80: 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  xt!=pBt ){.     
ec90: 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e     pList=pList->
eca0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
ecb0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
ecc0: 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pList) ){.      
ecd0: 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d    pList->pNext =
ece0: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
ecf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
ed00: 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  f( SQLITE_THREAD
ed10: 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71  SAFE ){.      sq
ed20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
ed30: 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  (pBt->mutex);.  
ed40: 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20    }.    removed 
ed50: 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 1;.  }.  sqlit
ed60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
ed70: 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
ed80: 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65  n removed;.#else
ed90: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
eda0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  dif.}../*.** Mak
edb0: 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70  e sure pBt->pTmp
edc0: 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20  Space points to 
edd0: 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66  an allocation of
ede0: 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a   .** MX_CELL_SIZ
edf0: 45 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f  E(pBt) bytes..*/
ee00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
ee10: 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
ee20: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
ee30: 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
ee40: 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
ee50: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
ee60: 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
ee70: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
ee80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
ee90: 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70  ee the pBt->pTmp
eea0: 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  Space allocation
eeb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
eec0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74  freeTempSpace(Bt
eed0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
eee0: 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
eef0: 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29   pBt->pTmpSpace)
ef00: 3b 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ;.  pBt->pTmpSpa
ef10: 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ce = 0;.}../*.**
ef20: 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
ef30: 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
ef40: 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
ef50: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
ef60: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
ef70: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
ef80: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
ef90: 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
efa0: 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
efb0: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
efc0: 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
efd0: 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
efe0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
eff0: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
f000: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
f010: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
f020: 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
f030: 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
f040: 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
f050: 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
f060: 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
f070: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
f080: 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
f090: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f0a0: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
f0b0: 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
f0c0: 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
f0d0: 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
f0e0: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
f0f0: 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
f100: 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
f110: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
f120: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
f130: 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
f140: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
f150: 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
f160: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
f170: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a  reeRollback(p);.
f180: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
f190: 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
f1a0: 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
f1b0: 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
f1c0: 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
f1d0: 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
f1e0: 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
f1f0: 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
f200: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
f210: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
f220: 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
f230: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
f240: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
f250: 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
f260: 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
f270: 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
f280: 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
f290: 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
f2a0: 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
f2b0: 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
f2c0: 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
f2d0: 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
f2e0: 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
f2f0: 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
f300: 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
f310: 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
f320: 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
f330: 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
f340: 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
f350: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
f360: 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
f370: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
f380: 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
f390: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  er);.    if( pBt
f3a0: 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26  ->xFreeSchema &&
f3b0: 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pBt->pSchema ){
f3c0: 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65  .      pBt->xFre
f3d0: 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63  eSchema(pBt->pSc
f3e0: 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hema);.    }.   
f3f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
f400: 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
f410: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
f420: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
f430: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
f440: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f450: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f460: 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
f470: 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
f480: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
f490: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
f4a0: 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
f4b0: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
f4c0: 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
f4d0: 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
f4e0: 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
f4f0: 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
f500: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
f510: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f520: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
f530: 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
f540: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
f550: 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74  ges allowed in t
f560: 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  he cache..**.** 
f570: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
f580: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
f590: 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  s is set to the 
f5a0: 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75  absolute.** valu
f5b0: 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66  e of mxPage.  If
f5c0: 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74   mxPage is negat
f5d0: 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77  ive, the pager w
f5e0: 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61  ill.** operate a
f5f0: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20  synchronously - 
f600: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70  it will not stop
f610: 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a   to do fsync()s.
f620: 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74  ** to insure dat
f630: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
f640: 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65  the disk surface
f650: 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69   before.** conti
f660: 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74  nuing.  Transact
f670: 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20  ions still work 
f680: 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  if synchronous i
f690: 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68  s off,.** and th
f6a0: 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f  e database canno
f6b0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69  t be corrupted i
f6c0: 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a  f this program.*
f6d0: 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20  * crashes.  But 
f6e0: 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  if the operating
f6f0: 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20   system crashes 
f700: 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  or there is.** a
f710: 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66  n abrupt power f
f720: 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63  ailure when sync
f730: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20  hronous is off, 
f740: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
f750: 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e  could be left in
f760: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
f770: 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62   and unrecoverab
f780: 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e  le state..** Syn
f790: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62  chronous is on b
f7a0: 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74  y default so dat
f7b0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
f7c0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61   is not.** norma
f7d0: 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a  lly a worry..*/.
f7e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
f7f0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
f800: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
f810: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
f820: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
f830: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
f840: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
f850: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
f860: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
f870: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
f880: 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
f890: 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
f8a0: 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
f8b0: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
f8c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
f8e0: 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73   the way data is
f8f0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
f900: 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72  in order to incr
f910: 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65  ease or decrease
f920: 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65  .** how well the
f930: 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74   database resist
f940: 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  s damage due to 
f950: 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70  OS crashes and p
f960: 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73  ower.** failures
f970: 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68  .  Level 1 is th
f980: 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68  e same as asynch
f990: 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73  ronous (no syncs
f9a0: 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20  () occur and.** 
f9b0: 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20  there is a high 
f9c0: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
f9d0: 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20  amage)  Level 2 
f9e0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  is the default. 
f9f0: 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76   There.** is a v
fa00: 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d  ery low but non-
fa10: 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79  zero probability
fa20: 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76   of damage.  Lev
fa30: 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65  el 3 reduces the
fa40: 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20  .** probability 
fa50: 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61  of damage to nea
fa60: 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20  r zero but with 
fa70: 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61  a write performa
fa80: 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a  nce reduction..*
fa90: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
faa0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
fab0: 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  MAS.int sqlite3B
fac0: 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76  treeSetSafetyLev
fad0: 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  el(Btree *p, int
fae0: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
faf0: 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65  Sync){.  BtShare
fb00: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
fb10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fb20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
fb30: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
fb40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
fb50: 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  er(p);.  sqlite3
fb60: 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
fb70: 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  vel(pBt->pPager,
fb80: 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63   level, fullSync
fb90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
fba0: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
fbb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fbc0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
fbd0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
fbe0: 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73  e given btree is
fbf0: 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c   set to safety l
fc00: 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65  evel 1.  In othe
fc10: 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75  r.** words, retu
fc20: 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79  rn TRUE if no sy
fc30: 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74  nc() occurs on t
fc40: 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a  he disk files..*
fc50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
fc60: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42  eeSyncDisabled(B
fc70: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
fc80: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
fc90: 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  Bt;.  int rc;.  
fca0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fcb0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
fcc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20  ->mutex) );  .  
fcd0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fce0: 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
fcf0: 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
fd00: 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er );.  rc = sql
fd10: 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28  ite3PagerNosync(
fd20: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
fd30: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
fd40: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
fd50: 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
fd60: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
fd70: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
fd80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
fd90: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a  _OMIT_VACUUM)./*
fda0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64  .** Change the d
fdb0: 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a  efault pages siz
fdc0: 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  e and the number
fdd0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74   of reserved byt
fde0: 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20  es per page..** 
fdf0: 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  Or, if the page 
fe00: 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79  size has already
fe10: 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74   been fixed, ret
fe20: 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
fe30: 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20  NLY .** without 
fe40: 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e  changing anythin
fe50: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  g..**.** The pag
fe60: 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
fe70: 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77   power of 2 betw
fe80: 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
fe90: 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a  6.  If the page.
fea0: 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64  ** size supplied
feb0: 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74   does not meet t
fec0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  his constraint t
fed0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a  hen the page siz
fee0: 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e  e is not.** chan
fef0: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20  ged..**.** Page 
ff00: 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72  sizes are constr
ff10: 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  ained to be a po
ff20: 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68  wer of two so th
ff30: 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a  at the region.**
ff40: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
ff50: 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c   file used for l
ff60: 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e  ocking (beginnin
ff70: 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54  g at PENDING_BYT
ff80: 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  E,.** the first 
ff90: 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47  byte past the 1G
ffa0: 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30  B boundary, 0x40
ffb0: 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f  000000) needs to
ffc0: 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65   occur.** at the
ffd0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
ffe0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  page..**.** If p
fff0: 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76  arameter nReserv
10000 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  e is less than z
10010 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ero, then the nu
10020 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
10030 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61  .** bytes per pa
10040 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61  ge is left uncha
10050 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nged..**.** If t
10060 68 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20  he iFix!=0 then 
10070 74 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65  the pageSizeFixe
10080 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  d flag is set so
10090 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
100a0 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
100b0 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
100c0 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
100d0 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
100e0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
100f0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
10100 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
10110 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
10120 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
10130 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
10140 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10150 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
10160 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
10170 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
10180 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10190 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
101a0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
101b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
101c0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
101d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
101e0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
101f0 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
10200 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
10210 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
10220 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
10230 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
10240 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
10250 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
10260 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
10270 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
10280 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
10290 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
102a0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
102b0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
102c0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
102d0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
102e0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
102f0 2d 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74  ->pPage1 && !pBt
10300 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
10310 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
10320 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
10330 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
10340 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
10350 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
10360 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
10370 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
10380 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
10390 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
103a0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
103b0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
103c0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
103d0 20 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ) pBt->pageSize
103e0 46 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c  Fixed = 1;.  sql
103f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10400 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10420 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
10430 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
10440 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10450 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
10460 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
10470 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
10480 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
10490 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
104a0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
104b0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
104c0 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
104d0 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
104e0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
104f0 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
10500 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
10510 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
10520 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
10530 73 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  sions..*/.int sq
10540 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
10550 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  erve(Btree *p){.
10560 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74    int n;.  sqlit
10570 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
10580 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
10590 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
105a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
105b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
105c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
105d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
105e0 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
105f0 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
10600 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
10610 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
10620 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
10630 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
10640 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
10650 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
10660 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
10670 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
10680 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
10690 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
106a0 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
106b0 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
106c0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
106d0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
106e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
106f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
10700 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
10710 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
10720 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
10730 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10740 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66  turn n;.}.#endif
10750 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
10760 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
10770 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69  RAGMAS) || !defi
10780 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
10790 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a  VACUUM) */../*.*
107a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75  * Change the 'au
107b0 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
107c0 72 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62  rty of the datab
107d0 61 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74  ase. If the 'aut
107e0 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61  oVacuum'.** para
107f0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
10800 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63  o, then auto-vac
10810 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62  uum mode is enab
10820 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74  led. If zero, it
10830 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e  .** is disabled.
10840 20 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c   The default val
10850 75 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d  ue for the auto-
10860 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20  vacuum property 
10870 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  is .** determine
10880 64 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f  d by the SQLITE_
10890 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
108a0 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74  UM macro..*/.int
108b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
108c0 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
108d0 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63   *p, int autoVac
108e0 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  uum){.#ifdef SQL
108f0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
10900 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  UUM.  return SQL
10910 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65  ITE_READONLY;.#e
10920 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a  lse.  BtShared *
10930 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
10940 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
10950 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75  OK;.  u8 av = (u
10960 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20  8)autoVacuum;.. 
10970 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10980 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
10990 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
109a0 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42  && (av ?1:0)!=pB
109b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
109c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
109d0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c  _READONLY;.  }el
109e0 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74  se{.    pBt->aut
109f0 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a  oVacuum = av ?1:
10a00 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  0;.    pBt->incr
10a10 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f  Vacuum = av==2 ?
10a20 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  1:0;.  }.  sqlit
10a30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
10a40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
10a50 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
10a60 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
10a70 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  f the 'auto-vacu
10a80 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66  um' property. If
10a90 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20   auto-vacuum is 
10aa0 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73  .** enabled 1 is
10ab0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
10ac0 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  wise 0..*/.int s
10ad0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
10ae0 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
10af0 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p){.#ifdef SQLIT
10b00 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
10b10 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45  M.  return BTREE
10b20 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
10b30 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63  ;.#else.  int rc
10b40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
10b50 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
10b60 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d   (.    (!p->pBt-
10b70 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52  >autoVacuum)?BTR
10b80 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
10b90 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  NE:.    (!p->pBt
10ba0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54  ->incrVacuum)?BT
10bb0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46  REE_AUTOVACUUM_F
10bc0 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41  ULL:.    BTREE_A
10bd0 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20  UTOVACUUM_INCR. 
10be0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
10bf0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
10c00 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
10c10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20  }.../*.** Get a 
10c20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61  reference to pPa
10c30 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  ge1 of the datab
10c40 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20  ase file.  This 
10c50 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71  will.** also acq
10c60 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20  uire a readlock 
10c70 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a  on that file..**
10c80 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
10c90 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
10ca0 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69  cess.  If the fi
10cb0 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77  le is not a.** w
10cc0 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
10cd0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53  ase file, then S
10ce0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73  QLITE_CORRUPT is
10cf0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51   returned..** SQ
10d00 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
10d10 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
10d20 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e  abase is locked.
10d30 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a    SQLITE_NOMEM.*
10d40 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  * is returned if
10d50 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d   we run out of m
10d60 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69  emory. .*/.stati
10d70 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28  c int lockBtree(
10d80 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10d90 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
10da0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
10db0 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
10dc0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
10dd0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
10de0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
10df0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
10e00 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
10e10 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
10e20 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
10e30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10e40 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
10e50 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d  rc;..  /* Do som
10e60 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65  e checking to he
10e70 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69  lp insure the fi
10e80 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61  le we opened rea
10e90 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61  lly is.  ** a va
10ea0 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  lid database fil
10eb0 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  e. .  */.  rc = 
10ec0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10ed0 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10ee0 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66  r, &nPage);.  if
10ef0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10f00 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65  ){.    goto page
10f10 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10f20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65   }else if( nPage
10f30 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61  >0 ){.    int pa
10f40 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20  geSize;.    int 
10f50 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
10f60 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67  u8 *page1 = pPag
10f70 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
10f80 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  c = SQLITE_NOTAD
10f90 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  B;.    if( memcm
10fa0 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48  p(page1, zMagicH
10fb0 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b  eader, 16)!=0 ){
10fc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
10fd0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10fe0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
10ff0 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20  e1[18]>1 ){.    
11000 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
11010 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
11020 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
11030 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11040 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
11060 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64  e maximum embedd
11070 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74  ed fraction must
11080 20 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e   be exactly 25%.
11090 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75    And the minimu
110a0 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65  m.    ** embedde
110b0 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
110c0 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74  be 12.5% for bot
110d0 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20  h leaf-data and 
110e0 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20  non-leaf-data.. 
110f0 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e     ** The origin
11100 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65  al design allowe
11110 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20  d these amounts 
11120 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20  to vary, but as 
11130 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f  of.    ** versio
11140 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75  n 3.6.0, we requ
11150 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66  ire them to be f
11160 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ixed..    */.   
11170 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67   if( memcmp(&pag
11180 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34  e1[21], "\100\04
11190 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a  0\040",3)!=0 ){.
111a0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
111b0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
111c0 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65    }.    pageSize
111d0 20 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67   = get2byte(&pag
111e0 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28  e1[16]);.    if(
111f0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
11200 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70  ageSize)!=0 || p
11210 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20  ageSize<512 ||. 
11220 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d         (SQLITE_M
11230 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37  AX_PAGE_SIZE<327
11240 36 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53  68 && pageSize>S
11250 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
11260 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  IZE).    ){.    
11270 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
11280 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
11290 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
112a0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
112b0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
112c0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
112d0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
112e0 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
112f0 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
11300 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
11310 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
11320 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11330 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
11340 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
11350 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
11360 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
11370 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
11380 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
11390 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
113a0 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
113b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
113c0 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
113d0 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
113e0 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
113f0 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
11400 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
11410 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
11420 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
11430 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
11440 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
11450 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11460 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
11470 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
11480 3d 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a  = (u16)usableSiz
11490 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
114a0 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
114b0 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72  geSize;.      fr
114c0 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
114d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
114e0 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
114f0 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
11500 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
11510 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11530 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73       pageSize-us
11540 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  ableSize);.     
11550 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 70   if( rc ) goto p
11560 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
11570 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
11580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
11590 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
115a0 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
115b0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
115c0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
115d0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
115e0 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
115f0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
11600 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62  Size = (u16)usab
11610 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
11620 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
11630 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
11640 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
11650 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
11660 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
11670 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
11680 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
11690 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
116a0 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
116b0 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
116c0 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
116d0 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
116e0 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
116f0 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
11700 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
11710 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
11720 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
11730 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
11740 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
11750 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
11760 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
11770 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
11780 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
11790 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
117a0 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
117b0 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
117c0 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
117d0 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
117e0 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
117f0 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
11800 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
11810 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
11820 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
11830 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
11840 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
11850 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
11860 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
11870 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20  -byte poiner, a 
11880 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
11890 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
118a0 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
118b0 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
118c0 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
118d0 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
118e0 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
118f0 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
11900 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
11910 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
11920 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
11930 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  23;.  pBt->minLo
11940 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
11950 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
11960 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
11970 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
11980 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
11990 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
119a0 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
119b0 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
119c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
119d0 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
119e0 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
119f0 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
11a00 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
11a10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11a20 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
11a30 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
11a40 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
11a50 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
11a60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11a70 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
11a80 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f  ne works like lo
11a90 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74  ckBtree() except
11aa0 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e   that it also in
11ab0 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73  vokes the.** bus
11ac0 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
11ad0 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74  ere is lock cont
11ae0 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ention..*/.stati
11af0 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57  c int lockBtreeW
11b00 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a  ithRetry(Btree *
11b10 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRef){.  int rc 
11b20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
11b30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
11b40 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
11b50 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52  Ref) );.  if( pR
11b60 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
11b70 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
11b80 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
11b90 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
11ba0 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
11bb0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
11bc0 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
11bd0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
11be0 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
11bf0 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
11c00 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
11c10 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
11c20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
11c30 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
11c40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
11c60 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
11c70 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
11c80 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
11c90 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
11ca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
11cb0 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
11cc0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
11cd0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
11ce0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
11cf0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
11d00 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
11d10 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
11d20 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
11d30 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
11d40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
11d50 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
11d60 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
11d70 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
11d80 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
11d90 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
11da0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
11db0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
11dc0 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
11dd0 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
11de0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11df0 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
11e00 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
11e10 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
11e20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11e30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
11e40 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
11e50 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
11e60 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
11e70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11e80 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11e90 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
11ea0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
11eb0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
11ec0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
11ed0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
11ee0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
11ef0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
11f00 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
11f10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
11f20 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
11f30 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61  ger)==1 );.    a
11f40 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
11f50 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  e1->aData );.   
11f60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 42 74   releasePage(pBt
11f70 2d 3e 70 50 61 67 65 31 29 3b 0a 20 20 20 20 70  ->pPage1);.    p
11f80 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
11f90 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
11fa0 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
11fb0 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
11fc0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
11fd0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
11fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11ff0 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
12000 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
12010 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
12020 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
12030 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
12040 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
12050 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12060 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12070 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
12080 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
12090 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
120a0 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
120b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
120c0 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
120d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
120e0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
120f0 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
12100 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
12110 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
12120 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12130 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
12140 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
12150 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
12160 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
12170 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
12180 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
12190 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
121a0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
121b0 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
121c0 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
121d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
121e0 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
121f0 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
12200 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
12210 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
12220 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
12230 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
12240 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
12250 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
12260 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
12270 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
12280 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
12290 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
122a0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
122b0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
122c0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
122d0 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
122e0 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
122f0 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
12300 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61  ATA );.  pBt->pa
12310 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
12320 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12330 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
12340 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
12350 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
12360 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
12370 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12380 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
12390 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
123a0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
123b0 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
123c0 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
123d0 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
123e0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
123f0 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
12400 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
12410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12420 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  K;.}../*.** Atte
12430 6d 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e  mpt to start a n
12440 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ew transaction. 
12450 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
12460 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65  ion.** is starte
12470 64 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20  d if the second 
12480 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a  argument is nonz
12490 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ero, otherwise a
124a0 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61   read-.** transa
124b0 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73  ction.  If the s
124c0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
124d0 73 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20  s 2 or more and 
124e0 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61  exclusive.** tra
124f0 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
12500 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  ted, meaning tha
12510 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
12520 73 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a  ss is allowed.**
12530 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64   to access the d
12540 61 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65  atabase.  A pree
12550 78 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74  xisting transact
12560 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a  ion may not be.*
12570 2a 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78  * upgraded to ex
12580 63 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69  clusive by calli
12590 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
125a0 61 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20  a second time - 
125b0 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69  the.** exclusivi
125c0 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72  ty flag only wor
125d0 6b 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61  ks for a new tra
125e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
125f0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
12600 69 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72  ion must be star
12610 74 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d  ted before attem
12620 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68  pting any .** ch
12630 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
12640 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20  abase.  None of 
12650 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  the following ro
12660 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20  utines .** will 
12670 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72  work unless a tr
12680 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61  ansaction is sta
12690 72 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a  rted first:.**.*
126a0 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
126b0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29  reeCreateTable()
126c0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
126d0 42 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78  BtreeCreateIndex
126e0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
126f0 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
12700 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
12710 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
12720 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
12730 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29  te3BtreeInsert()
12740 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
12750 42 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a  BtreeDelete().**
12760 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12770 65 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a  eeUpdateMeta().*
12780 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69  *.** If an initi
12790 61 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63  al attempt to ac
127a0 71 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66  quire the lock f
127b0 61 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20  ails because of 
127c0 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a  lock contention.
127d0 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
127e0 61 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ase was previous
127f0 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65  ly unlocked, the
12800 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  n invoke the bus
12810 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20  y handler.** if 
12820 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42  there is one.  B
12830 75 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20  ut if there was 
12840 70 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61  previously a rea
12850 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a  d-lock, do not.*
12860 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * invoke the bus
12870 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74  y handler - just
12880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
12890 55 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53  USY.  SQLITE_BUS
128a0 59 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  Y is .** returne
128b0 64 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  d when there is 
128c0 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c  already a read-l
128d0 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ock in order to 
128e0 61 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b  avoid a deadlock
128f0 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ..**.** Suppose 
12900 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72  there are two pr
12910 6f 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e  ocesses A and B.
12920 20 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c    A has a read l
12930 6f 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a  ock and B has.**
12940 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
12950 2e 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72  .  B tries to pr
12960 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69  omote to exclusi
12970 76 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ve but is blocke
12980 64 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20  d because.** of 
12990 41 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20  A's read lock.  
129a0 41 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  A tries to promo
129b0 74 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62  te to reserved b
129c0 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79  ut is blocked by
129d0 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68   B..** One or th
129e0 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74  e other of the t
129f0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73  wo processes mus
12a00 74 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68  t give way or th
12a10 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f  ere can be.** no
12a20 20 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72   progress.  By r
12a30 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f  eturning SQLITE_
12a40 42 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76  BUSY and not inv
12a50 6f 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63  oking the busy c
12a60 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20  allback.** when 
12a70 41 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  A already has a 
12a80 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e  read lock, we en
12a90 63 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76  courage A to giv
12aa0 65 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a  e up and let B.*
12ab0 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e  * proceed..*/.in
12ac0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
12ad0 67 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  ginTrans(Btree *
12ae0 70 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a  p, int wrflag){.
12af0 20 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63    sqlite3 *pBloc
12b00 6b 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72 65  k = 0;.  BtShare
12b10 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12b20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12b30 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65  TE_OK;..  sqlite
12b40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12b50 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
12b60 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12b70 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65 61  e btree is alrea
12b80 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72  dy in a write-tr
12b90 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74  ansaction, or it
12ba0 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79  .  ** is already
12bb0 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73   in a read-trans
12bc0 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61  action and a rea
12bd0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d-transaction.  
12be0 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ** is requested,
12bf0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
12c00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
12c10 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
12c20 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72  RITE || (p->inTr
12c30 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20  ans==TRANS_READ 
12c40 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20  && !wrflag) ){. 
12c50 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
12c60 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  gun;.  }..  /* W
12c70 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12c80 73 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62  s are not possib
12c90 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c  le on a read-onl
12ca0 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
12cb0 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
12cc0 79 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  y && wrflag ){. 
12cd0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
12ce0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74  EADONLY;.    got
12cf0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
12d00 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
12d10 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12d20 41 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f  ACHE.  /* If ano
12d30 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
12d40 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
12d50 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
12d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a  transaction .  *
12d70 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64  * on this shared
12d80 2d 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65  -btree structure
12d90 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72   and a second wr
12da0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
12db0 69 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65  is.  ** requeste
12dc0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
12dd0 5f 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20  _LOCKED..  */.  
12de0 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70  if( (wrflag && p
12df0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12e00 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  n==TRANS_WRITE) 
12e10 7c 7c 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e  || pBt->isPendin
12e20 67 20 29 7b 0a 20 20 20 20 70 42 6c 6f 63 6b 20  g ){.    pBlock 
12e30 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
12e40 64 62 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  db;.  }else if( 
12e50 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
12e60 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
12e70 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74     for(pIter=pBt
12e80 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
12e90 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
12ea0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  xt){.      if( p
12eb0 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
12ec0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 6c 6f 63  ){.        pBloc
12ed0 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65  k = pIter->pBtre
12ee0 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 62  e->db;.        b
12ef0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
12f00 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 42    }.  }.  if( pB
12f10 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c 69  lock ){.    sqli
12f20 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
12f30 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f  cked(p->db, pBlo
12f40 63 6b 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ck);.    rc = SQ
12f50 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
12f60 45 44 43 41 43 48 45 3b 0a 20 20 20 20 67 6f 74  EDCACHE;.    got
12f70 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
12f80 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20   }.#endif..  do 
12f90 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
12fa0 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
12fb0 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
12fc0 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
12fd0 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
12fe0 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
12ff0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
13000 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
13010 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
13020 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
13030 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
13040 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
13050 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
13060 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
13070 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
13080 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
13090 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
130a0 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
130b0 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
130c0 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
130d0 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
130e0 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
130f0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
13100 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
13110 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
13120 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
13130 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
13140 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
13150 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
13160 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
13170 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13180 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
13190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  ){.      if( pBt
131a0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
131b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
131c0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
131d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
131e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
131f0 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61  erBegin(pBt->pPa
13200 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c  ger,wrflag>1,sql
13210 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
13220 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
13230 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13240 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13250 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
13260 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
13270 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13280 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53    .    if( rc!=S
13290 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
132a0 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
132b0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
132c0 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
132d0 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
132e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
132f0 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
13300 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65  .          btree
13310 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
13320 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28  r(pBt) );..  if(
13330 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13340 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  {.    if( p->inT
13350 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
13360 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e   ){.      pBt->n
13370 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 20  Transaction++;. 
13380 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72     }.    p->inTr
13390 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52  ans = (wrflag?TR
133a0 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f  ANS_WRITE:TRANS_
133b0 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70  READ);.    if( p
133c0 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69  ->inTrans>pBt->i
133d0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
133e0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
133f0 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e  nsaction = p->in
13400 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 23 69 66  Trans;.    }.#if
13410 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13420 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
13430 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a    if( wrflag ){.
13440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
13450 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
13460 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
13470 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
13480 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20  ->isExclusive = 
13490 28 75 38 29 28 77 72 66 6c 61 67 3e 31 29 3b 0a  (u8)(wrflag>1);.
134a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
134b0 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a  ...trans_begun:.
134c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
134d0 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b  _OK && wrflag ){
134e0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c  .    /* This cal
134f0 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61  l makes sure tha
13500 74 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  t the pager has 
13510 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
13520 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65  er of.    ** ope
13530 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66  n savepoints. If
13540 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   the second para
13550 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72  meter is greater
13560 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20   than 0 and.    
13570 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ** the sub-journ
13580 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  al is not alread
13590 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20  y open, then it 
135a0 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68  will be opened h
135b0 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
135c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
135d0 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
135e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
135f0 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
13600 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
13610 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
13620 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
13630 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13640 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13650 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13660 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
13670 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
13680 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
13690 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
136a0 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
136b0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
136c0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
136d0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
136e0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
136f0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
13700 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
13710 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
13720 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13730 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
13740 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
13750 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
13760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13770 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
13780 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
13790 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
137a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
137c0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
137d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13800 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
13810 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13820 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20  Page->pBt;.  u8 
13830 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
13840 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
13850 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
13860 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
13870 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
13880 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
13890 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
138a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
138b0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
138c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
138d0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
138e0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
138f0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
13900 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
13910 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
13920 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
13930 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
13940 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
13950 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
13960 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
13970 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
13980 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13990 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
139a0 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
139b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
139c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
139d0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
139e0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
139f0 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
13a00 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
13a10 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
13a20 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
13a30 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
13a40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13a50 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
13a60 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
13a70 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
13a80 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
13a90 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
13aa0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
13ab0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
13ac0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
13ad0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
13ae0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
13af0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
13b00 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
13b10 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
13b20 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
13b30 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
13b40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13b50 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
13b60 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
13b70 68 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  h is guaranteed 
13b80 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
13b90 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
13ba0 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
13bb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
13bc0 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
13bd0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
13be0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
13bf0 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
13c00 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
13c10 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
13c20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
13c30 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
13c40 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
13c50 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
13c60 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
13c70 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
13c80 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
13c90 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
13ca0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
13cb0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
13cc0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
13cd0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
13ce0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
13cf0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
13d00 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
13d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
13d30 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
13d40 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
13d50 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
13d60 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
13d70 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
13d80 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
13d90 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
13da0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
13db0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
13dc0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
13dd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
13de0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
13df0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
13e00 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
13e10 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
13e20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13e30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
13e40 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
13e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13e60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
13e70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
13e80 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
13e90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
13ea0 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
13eb0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
13ec0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
13ed0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
13ee0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
13ef0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
13f00 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
13f10 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
13f20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13f30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
13f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
13f50 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
13f60 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
13f70 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
13f80 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
13f90 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
13fa0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
13fb0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
13fc0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
13fd0 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
13fe0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
13ff0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
14000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
14010 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
14020 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
14030 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
14040 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
14050 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
14060 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
14070 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
14080 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
14090 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
140a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
140b0 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  o.iOverflow ){. 
140c0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
140d0 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70 43  om==get4byte(&pC
140e0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
140f0 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ow]) ){.        
14100 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 43      put4byte(&pC
14110 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
14120 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ow], iTo);.     
14130 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14140 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14150 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
14160 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
14170 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
14180 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
14190 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
141a0 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
141b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
141c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
141d0 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
141e0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
141f0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
14200 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
14210 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
14220 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
14230 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
14240 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
14250 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14260 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
14270 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62     }.      put4b
14280 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
14290 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
142a0 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  et+8], iTo);.   
142b0 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   }..    pPage->i
142c0 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
142d0 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ig;.  }.  return
142e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
142f0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f  /*.** Move the o
14300 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  pen database pag
14310 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63  e pDbPage to loc
14320 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20  ation iFreePage 
14330 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  in the .** datab
14340 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67 65  ase. The pDbPage
14350 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69   reference remai
14360 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61  ns valid..*/.sta
14370 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
14380 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
14390 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
143a0 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
143b0 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
143c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
143d0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
143e0 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
143f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
14400 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
14410 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
14420 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
14430 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
14440 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
14450 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
14460 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
14470 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
14480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14490 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
144a0 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
144b0 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 0a 29    int isCommit.)
144c0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
144d0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
144e0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
144f0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
14500 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
14510 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
14520 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
14530 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
14540 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
14550 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
14560 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
14570 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
14580 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
14590 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
145a0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
145b0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
145c0 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
145d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
145e0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
145f0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
14600 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
14610 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
14620 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
14630 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
14640 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
14650 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
14660 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
14670 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
14680 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
14690 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
146a0 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
146b0 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
146c0 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
146d0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
146e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
146f0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
14700 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
14710 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
14720 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
14730 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14740 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
14750 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
14760 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
14770 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
14780 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
14790 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
147a0 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
147b0 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
147c0 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
147d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
147e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
147f0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
14800 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
14810 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
14820 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
14830 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
14840 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
14850 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
14860 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
14870 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
14880 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
14890 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
148a0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
148b0 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
148c0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
148d0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
148e0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
148f0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
14900 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
14910 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
14920 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
14930 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
14940 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
14950 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
14960 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14970 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14990 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
149a0 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
149b0 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
149c0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
149d0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
149e0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
149f0 61 70 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f  apPut(pBt, nextO
14a00 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
14a10 46 4c 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65  FLOW2, iFreePage
14a20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
14a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
14a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14a60 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
14a70 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
14a80 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
14a90 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
14aa0 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
14ab0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
14ac0 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
14ad0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
14ae0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
14af0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
14b00 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
14b10 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
14b20 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
14b30 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
14b40 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61 67  age(pBt, iPtrPag
14b50 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30 29  e, &pPtrPage, 0)
14b60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14b90 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
14ba0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 74  e3PagerWrite(pPt
14bb0 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  rPage->pDbPage);
14bc0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
14bd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
14be0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72  releasePage(pPtr
14bf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
14c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14c10 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61 67    rc = modifyPag
14c20 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61 67  ePointer(pPtrPag
14c30 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72 65  e, iDbPage, iFre
14c40 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a 20  ePage, eType);. 
14c50 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
14c60 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66  PtrPage);.    if
14c70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
14c80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
14c90 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46 72  rmapPut(pBt, iFr
14ca0 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69  eePage, eType, i
14cb0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  PtrPage);.    }.
14cc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14cd0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
14ce0 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69  eclaration requi
14cf0 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75 75  red by incrVacuu
14d00 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74  mStep(). */.stat
14d10 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
14d20 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72 65  treePage(BtShare
14d30 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c  d *, MemPage **,
14d40 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75   Pgno *, Pgno, u
14d50 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f  8);../*.** Perfo
14d60 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70  rm a single step
14d70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   of an increment
14d80 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75  al-vacuum. If su
14d90 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74  ccessful,.** ret
14da0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
14db0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f  f there is no wo
14dc0 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68  rk to do (and th
14dd0 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f  erefore no.** po
14de0 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74  int in calling t
14df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61  his function aga
14e00 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  in), return SQLI
14e10 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d  TE_DONE..**.** M
14e20 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20  ore specificly, 
14e30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
14e40 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
14e50 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61  anize the .** da
14e60 74 61 62 61 73 65 20 73 6f 20 74 68 61 74 20 74  tabase so that t
14e70 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
14e80 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
14e90 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20  ly in use.** is 
14ea0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
14eb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
14ec0 46 69 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  Fin parameter is
14ed0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69   non-zero, the i
14ee0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73  mplementation as
14ef0 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68  sumes.** that th
14f00 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65  e caller will ke
14f10 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56  ep calling incrV
14f20 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69  acuumStep() unti
14f30 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20  l.** it returns 
14f40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
14f50 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61  n error, and tha
14f60 74 20 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a  t nFin is the.**
14f70 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
14f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14f90 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20  le will contain 
14fa0 61 66 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70  after this .** p
14fb0 72 6f 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65  rocess is comple
14fc0 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  te..*/.static in
14fd0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
14fe0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
14ff0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
15000 69 4c 61 73 74 50 67 29 7b 0a 20 20 50 67 6e 6f  iLastPg){.  Pgno
15010 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20   nFreeList;     
15020 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15030 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f  of pages still o
15040 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
15050 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
15060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15070 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
15080 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
15090 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
150a0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
150b0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
150c0 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
150d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
150e0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
150f0 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
15100 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b    Pgno iPtrPage;
15110 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20  ..    nFreeList 
15120 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
15130 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
15140 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72  6]);.    if( nFr
15150 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eeList==0 ){.   
15160 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15170 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _DONE;.    }..  
15180 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
15190 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
151a0 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65  eType, &iPtrPage
151b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
151c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
151d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
151e0 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65   }.    if( eType
151f0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
15200 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E ){.      retur
15210 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
15220 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
15230 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15240 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
15250 20 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d        if( nFin==
15260 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
15270 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  Remove the page 
15280 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66  from the files f
15290 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69  ree-list. This i
152a0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20  s not required. 
152b0 20 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69         ** if nFi
152c0 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  n is non-zero. I
152d0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
152e0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
152f0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
15300 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
15310 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
15320 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
15330 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
15340 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
15350 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
15360 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
15370 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
15380 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
15390 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
153a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
153b0 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
153c0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
153d0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
153e0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
153f0 74 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tPg, 1);.       
15400 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15420 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15430 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
15440 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c  ert( iFreePg==iL
15450 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20  astPg );.       
15460 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
15470 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  eePg);.      }. 
15480 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
15490 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20    Pgno iFreePg; 
154a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
154b0 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67  ndex of free pag
154c0 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50  e to move pLastP
154d0 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65  g to */.      Me
154e0 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a  mPage *pLastPg;.
154f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15500 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
15510 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70  pBt, iLastPg, &p
15520 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20  LastPg, 0);.    
15530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
15550 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15560 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  }..      /* If n
15570 46 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69  Fin is zero, thi
15580 73 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63  s loop runs exac
15590 74 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67  tly once and pag
155a0 65 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20  e pLastPg.      
155b0 2a 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69  ** is swapped wi
155c0 74 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65  th the first fre
155d0 65 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66  e page pulled of
155e0 66 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e  f the free list.
155f0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
15600 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ** On the other 
15610 68 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73  hand, if nFin is
15620 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
15630 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20  ro, then keep.  
15640 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75      ** looping u
15650 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65  ntil a free-page
15660 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20   located within 
15670 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70  the first nFin p
15680 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ages.      ** of
15690 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75   the file is fou
156a0 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
156b0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
156c0 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
156d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
156e0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
156f0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
15700 26 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b  &iFreePg, 0, 0);
15710 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
15720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15730 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
15740 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
15750 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
15760 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15770 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
15780 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
15790 20 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30   }while( nFin!=0
157a0 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e   && iFreePg>nFin
157b0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
157c0 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50  ( iFreePg<iLastP
157d0 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20  g );.      .    
157e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
157f0 67 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67  gerWrite(pLastPg
15800 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15810 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15820 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
15830 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65  c = relocatePage
15840 28 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65  (pBt, pLastPg, e
15850 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
15860 69 46 72 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30  iFreePg, nFin!=0
15870 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15880 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
15890 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  stPg);.      if(
158a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
158b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
158c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
158d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 46   }.  }..  if( nF
158e0 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  in==0 ){.    iLa
158f0 73 74 50 67 2d 2d 3b 0a 20 20 20 20 77 68 69 6c  stPg--;.    whil
15900 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
15910 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
15920 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
15930 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20  E(pBt, iLastPg) 
15940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 54 52  ){.      if( PTR
15950 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
15960 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20  iLastPg) ){.    
15970 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
15980 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
15990 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
159a0 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73  etPage(pBt, iLas
159b0 74 50 67 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  tPg, &pPg, 0);. 
159c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
159d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
159e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
159f0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15a00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15a10 61 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70  agerWrite(pPg->p
15a20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
15a30 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67   releasePage(pPg
15a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
15a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15a60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
15a70 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
15a80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4c 61       }.      iLa
15a90 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  stPg--;.    }.  
15aa0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
15ab0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
15ac0 3e 70 50 61 67 65 72 2c 20 69 4c 61 73 74 50 67  >pPager, iLastPg
15ad0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
15ae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
15af0 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
15b00 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
15b10 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
15b20 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
15b30 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
15b40 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
15b50 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
15b60 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
15b70 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
15b80 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
15b90 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
15ba0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
15bb0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
15bc0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
15bd0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
15be0 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
15bf0 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
15c00 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
15c10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
15c20 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
15c30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
15c40 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
15c50 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
15c60 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
15c70 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
15c80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15c90 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
15ca0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
15cb0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
15cc0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15cd0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
15ce0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
15cf0 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
15d00 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
15d10 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
15d20 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
15d30 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
15d40 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
15d50 29 3b 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72  );.    rc = incr
15d60 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
15d70 30 2c 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  0, pagerPagecoun
15d80 74 28 70 42 74 29 29 3b 0a 20 20 7d 0a 20 20 73  t(pBt));.  }.  s
15d90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15da0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
15db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
15dc0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
15dd0 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
15de0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
15df0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
15e00 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
15e10 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
15e20 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
15e30 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
15e40 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
15e50 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
15e60 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
15e70 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
15e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
15e90 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
15ea0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
15eb0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
15ec0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
15ed0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
15ee0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
15ef0 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
15f00 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
15f10 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
15f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
15f30 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
15f40 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
15f50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15f60 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
15f70 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
15f80 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
15f90 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
15fa0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
15fb0 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 61 73  pPager) );..  as
15fc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15fd0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
15fe0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
15ff0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
16000 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
16010 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
16020 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
16030 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
16040 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 0a 20      Pgno nFin;. 
16050 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20     Pgno nFree;. 
16060 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b     Pgno nPtrmap;
16070 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
16080 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70  .    const int p
16090 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  gsz = pBt->pageS
160a0 69 7a 65 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  ize;.    Pgno nO
160b0 72 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  rig = pagerPagec
160c0 6f 75 6e 74 28 70 42 74 29 3b 0a 0a 20 20 20 20  ount(pBt);..    
160d0 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
160e0 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c  E(pBt, nOrig) ||
160f0 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f   nOrig==PENDING_
16100 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
16110 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73  {.      /* It is
16120 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
16130 20 63 72 65 61 74 65 20 61 20 64 61 74 61 62 61   create a databa
16140 73 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  se for which the
16150 20 66 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20   final page.    
16160 20 20 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61    ** is either a
16170 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
16180 65 20 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67  e or the pending
16190 2d 62 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f  -byte page. If o
161a0 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  ne.      ** is e
161b0 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73  ncountered, this
161c0 20 69 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75   indicates corru
161d0 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
161e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
161f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16200 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72  ;.    }..    nFr
16210 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
16220 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
16230 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e 50 74 72  a[36]);.    nPtr
16240 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72  map = (nFree-nOr
16250 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  ig+PTRMAP_PAGENO
16260 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73  (pBt, nOrig)+pgs
16270 7a 2f 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20  z/5)/(pgsz/5);. 
16280 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
16290 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
162a0 70 3b 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67  p;.    if( nOrig
162b0 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
162c0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
162d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
162e0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
162f0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  nFin--;.    }.  
16300 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
16310 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
16320 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
16330 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16340 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
16350 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  -;.    }.    if(
16360 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65   nFin>nOrig ) re
16370 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
16380 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 20 20 66  UPT_BKPT;..    f
16390 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
163a0 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
163b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
163c0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
163d0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
163e0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
163f0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
16400 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  ( (rc==SQLITE_DO
16410 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  NE || rc==SQLITE
16420 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30 20  _OK) && nFree>0 
16430 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
16440 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 72  LITE_OK;.      r
16450 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16460 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
16470 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
16480 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
16490 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
164a0 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
164b0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
164c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
164d0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
164e0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
164f0 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
16500 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  , nFin);.    }. 
16510 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
16530 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
16540 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
16550 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
16560 20 6e 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61   nRef==sqlite3Pa
16570 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
16580 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
16590 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
165a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
165b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
165c0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
165d0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
165e0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
165f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16600 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
16610 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
16620 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
16630 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
16640 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
16650 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
16660 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
16670 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
16680 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
16690 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
166a0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
166b0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
166c0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
166d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
166e0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
166f0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
16700 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
16710 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
16720 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
16730 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
16740 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
16750 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
16760 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
16770 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
16780 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
16790 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
167a0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
167b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
167c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
167d0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
167e0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
167f0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
16800 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
16810 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
16820 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
16830 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
16840 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
16850 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
16860 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
16870 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
16880 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
16890 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
168a0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
168b0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
168c0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
168d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
168e0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
168f0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
16900 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
16910 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
16920 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
16930 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
16940 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
16950 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
16960 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
16970 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
16980 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
16990 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
169a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
169b0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
169c0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
169d0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
169e0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
169f0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
16a00 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
16a10 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
16a20 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
16a30 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
16a40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
16a50 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
16a60 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
16a70 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
16a80 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
16a90 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
16aa0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
16ab0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
16ac0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
16ad0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
16ae0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
16af0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
16b00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
16b10 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
16b20 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
16b30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
16b40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16b50 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
16b60 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
16b70 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
16b80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
16b90 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
16ba0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
16bb0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
16bc0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
16bd0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
16be0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
16bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16c00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
16c10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
16c20 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
16c30 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
16c40 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
16c50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16c60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16c70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16c80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
16c90 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
16ca0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63   }.#endif.    rc
16cb0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
16cc0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
16cd0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  t->pPager, zMast
16ce0 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  er, 0);.    sqli
16cf0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
16d10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
16d20 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
16d30 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
16d40 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
16d50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
16d60 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
16d70 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
16d80 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
16d90 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
16da0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
16db0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
16dc0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
16dd0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
16de0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
16df0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
16e00 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
16e10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
16e20 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
16e30 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
16e40 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
16e50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
16e60 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
16e70 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
16e80 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
16e90 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
16ea0 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
16eb0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
16ec0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
16ed0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
16ee0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
16ef0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
16f00 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
16f10 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
16f20 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
16f30 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
16f40 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
16f50 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
16f60 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
16f70 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
16f80 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16f90 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
16fa0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
16fb0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
16fc0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
16fd0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
16fe0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
16ff0 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
17000 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
17010 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
17020 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
17030 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
17040 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
17050 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
17060 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
17070 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
17080 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
17090 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
170a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
170b0 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
170c0 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
170d0 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
170e0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
170f0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
17100 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
17110 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
17120 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
17130 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
17140 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
17150 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
17160 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
17170 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
17180 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
17190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
171a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
171b0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
171c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
171d0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
171e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
171f0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
17200 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
17210 6c 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20  le has any kind 
17220 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
17230 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
17240 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
17250 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65   ** count of the
17260 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
17270 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
17280 6e 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  n count reaches 
17290 30 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20  0, set.  ** the 
172a0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
172b0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
172c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
172d0 73 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77  sed() call below
172e0 0a 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63  .  ** will unloc
172f0 6b 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a  k the pager..  *
17300 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
17310 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
17320 7b 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68  {.    clearAllSh
17330 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
17340 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  cks(p);.    pBt-
17350 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
17360 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
17370 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
17380 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
17390 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
173a0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
173b0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
173c0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
173d0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
173e0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
173f0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
17400 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
17410 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
17420 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
17430 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
17440 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
17450 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d  ntent(pBt);.  p-
17460 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
17470 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42  _NONE;.  unlockB
17480 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
17490 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
174a0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
174b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
174c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
174d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  _OK;.}../*.** Do
174e0 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20   both phases of 
174f0 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74  a commit..*/.int
17500 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17510 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  mit(Btree *p){. 
17520 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
17530 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17540 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
17550 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
17560 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20  ne(p, 0);.  if( 
17570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17580 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17590 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
175a0 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73  eTwo(p);.  }.  s
175b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
175c0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
175d0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
175e0 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
175f0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
17600 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65  rite-cursors ope
17610 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65  n on this handle
17620 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73  . This is for us
17630 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29  e.** in assert()
17640 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f   expressions, so
17650 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70   it is only comp
17660 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69  iled if NDEBUG i
17670 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64  s not.** defined
17680 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ..**.** For the 
17690 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73  purposes of this
176a0 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74   routine, a writ
176b0 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  e-cursor is any 
176c0 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
176d0 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69  s capable of wri
176e0 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
176f0 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73  bse.  That means
17700 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a   the cursor was.
17710 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70  ** originally op
17720 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
17730 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
17740 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62  has not be disab
17750 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67  led.** by having
17760 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67   its state chang
17770 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  ed to CURSOR_FAU
17780 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LT..*/.static in
17790 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  t countWriteCurs
177a0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
177b0 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
177c0 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20  pCur;.  int r = 
177d0 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42  0;.  for(pCur=pB
177e0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72  t->pCursor; pCur
177f0 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65  ; pCur=pCur->pNe
17800 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  xt){.    if( pCu
17810 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75  r->wrFlag && pCu
17820 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
17830 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a  R_FAULT ) r++; .
17840 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a    }.  return r;.
17850 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17860 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
17870 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
17880 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
17890 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
178a0 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
178b0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
178c0 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
178d0 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
178e0 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ces..**.** Every
178f0 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70   cursor is tripp
17900 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75  ed, including cu
17910 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e  rsors that belon
17920 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61  g.** to other da
17930 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
17940 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74  ns that happen t
17950 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  o be sharing.** 
17960 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70  the cache with p
17970 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  Btree..**.** Thi
17980 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63  s routine gets c
17990 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c  alled when a rol
179a0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a  lback occurs..**
179b0 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69   All cursors usi
179c0 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  ng the same cach
179d0 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65  e must be trippe
179e0 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20  d.** to prevent 
179f0 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67  them from trying
17a00 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65   to use the btre
17a10 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72  e after.** the r
17a20 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f  ollback.  The ro
17a30 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
17a40 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a  deleted tables.*
17a50 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20  * or moved root 
17a60 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20  pages, so it is 
17a70 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74  not sufficient t
17a80 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74  o.** save the st
17a90 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f  ate of the curso
17aa0 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  r.  The cursor m
17ab0 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
17ac0 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dated..*/.void s
17ad0 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
17ae0 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
17af0 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
17b00 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f  Code){.  BtCurso
17b10 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42  r *p;.  sqlite3B
17b20 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
17b30 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65  );.  for(p=pBtre
17b40 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
17b50 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
17b60 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
17b70 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
17b80 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  rCursor(p);.    
17b90 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
17ba0 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
17bb0 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
17bc0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
17bd0 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  =p->iPage; i++){
17be0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
17bf0 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29  ge(p->apPage[i])
17c00 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67  ;.      p->apPag
17c10 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  e[i] = 0;.    }.
17c20 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
17c30 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
17c40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
17c50 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
17c60 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  on in progress. 
17c70 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c   All cursors wil
17c80 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65  l be.** invalide
17c90 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
17ca0 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
17cb0 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  t to use a curso
17cc0 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f 70  r.** that was op
17cd0 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
17ce0 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
17cf0 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ation will resul
17d00 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72  t.** in an error
17d10 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
17d20 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
17d30 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
17d40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
17d50 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
17d60 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
17d70 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
17d80 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
17d90 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
17da0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42  3BtreeRollback(B
17db0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
17dc0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
17dd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17de0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
17df0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
17e00 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d  Enter(p);.  rc =
17e10 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
17e20 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
17e30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17e40 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
17e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17e60 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
17e70 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
17e80 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
17e90 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
17ea0 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
17eb0 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74  .    ** trying t
17ec0 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f  o save cursor po
17ed0 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73  sitions. If this
17ee0 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63   is an automatic
17ef0 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20   rollback (as.  
17f00 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20    ** the result 
17f10 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c  of a constraint,
17f20 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
17f30 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74  e or IO error) t
17f40 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
17f50 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74  cache may be int
17f60 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73  ernally inconsis
17f70 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69  tent (not contai
17f80 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73  n valid trees) s
17f90 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e  o.    ** we cann
17fa0 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e  ot simply return
17fb0 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68   the error to th
17fc0 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61  e caller. Instea
17fd0 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a  d, abort .    **
17fe0 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61   all queries tha
17ff0 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61  t may be using a
18000 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ny of the cursor
18010 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f  s that failed to
18020 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   save..    */.  
18030 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72    sqlite3BtreeTr
18040 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
18050 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  rc);.  }.#endif.
18060 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
18070 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  (p);..  if( p->i
18080 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
18090 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
180a0 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  c2;..    assert(
180b0 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42   TRANS_WRITE==pB
180c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
180d0 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71   );.    rc2 = sq
180e0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
180f0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
18100 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51  .    if( rc2!=SQ
18110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18120 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
18130 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c  ..    /* The rol
18140 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
18150 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50 61  estroyed the pPa
18160 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65  ge1->aData value
18170 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c  .  So.    ** cal
18180 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  l sqlite3BtreeGe
18190 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
181a0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
181b0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
181c0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
181d0 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
181e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
181f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
18200 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
18210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18220 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
18230 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
18240 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57    assert( countW
18250 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74 29  riteCursors(pBt)
18260 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
18270 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
18280 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a  TRANS_READ;.  }.
18290 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
182a0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
182b0 0a 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68 61  .    clearAllSha
182c0 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
182d0 6b 73 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  ks(p);.    asser
182e0 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
182f0 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42  tion>0 );.    pB
18300 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
18310 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42  -;.    if( 0==pB
18320 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  t->nTransaction 
18330 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
18340 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
18350 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ANS_NONE;.    }.
18360 20 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c 65 61    }..  btreeClea
18370 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
18380 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  ;.  p->inTrans =
18390 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75   TRANS_NONE;.  u
183a0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
183b0 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65  ed(pBt);..  btre
183c0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
183d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
183e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
183f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
18400 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
18410 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
18420 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
18430 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
18440 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
18450 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
18460 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
18470 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
18480 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
18490 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
184a0 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
184b0 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
184c0 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
184d0 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
184e0 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
184f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
18500 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
18510 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
18520 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
18530 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
18540 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
18550 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
18560 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
18570 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
18580 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
18590 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
185a0 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
185b0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
185c0 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
185d0 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
185e0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
185f0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
18600 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
18610 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
18620 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
18630 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
18640 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
18650 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
18660 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
18670 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
18680 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
18690 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
186a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
186b0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
186c0 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
186d0 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
186e0 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
186f0 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
18700 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
18710 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
18720 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
18730 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
18740 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
18750 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
18760 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
18770 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
18780 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
18790 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
187a0 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
187b0 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
187c0 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
187d0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
187e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
187f0 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
18800 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
18810 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
18820 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18830 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
18840 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18850 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
18860 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
18870 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
18880 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
18890 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
188a0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
188b0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
188c0 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
188d0 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt );.  if( NEVE
188e0 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  R(p->inTrans!=TR
188f0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74  ANS_WRITE || pBt
18900 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
18910 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
18920 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65  NTERNAL;.  }else
18930 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
18940 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18950 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18960 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70  .    /* At the p
18970 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
18980 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
18990 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
189a0 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  nt with.    ** a
189b0 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
189c0 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
189d0 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
189e0 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20  icitly using.   
189f0 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
18a00 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
18a10 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
18a20 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
18a30 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73  ny.    ** such s
18a40 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
18a50 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
18a60 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
18a70 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
18a80 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
18a90 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
18aa0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
18ab0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
18ac0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
18ad0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
18ae0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18af0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
18b00 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
18b10 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
18b20 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
18b30 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
18b40 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
18b50 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
18b60 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
18b70 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
18b80 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
18b90 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
18ba0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
18bb0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
18bc0 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
18bd0 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
18be0 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
18bf0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
18c00 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
18c10 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
18c20 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
18c30 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
18c40 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
18c50 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
18c60 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
18c70 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
18c80 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
18c90 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
18ca0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
18cb0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
18cc0 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
18cd0 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
18ce0 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
18cf0 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
18d00 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
18d10 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
18d20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18d30 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
18d40 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
18d50 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
18d60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18d70 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
18d80 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
18d90 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
18da0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
18db0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
18dc0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
18dd0 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
18de0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
18df0 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
18e00 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
18e10 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
18e20 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
18e30 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
18e40 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18e50 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
18e60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
18e70 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
18e80 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
18e90 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
18ea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18eb0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
18ec0 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
18ed0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
18ee0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
18ef0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18f00 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
18f10 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
18f20 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
18f30 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
18f40 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
18f50 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
18f60 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
18f70 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
18f80 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
18f90 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
18fa0 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
18fb0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
18fc0 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
18fd0 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
18fe0 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
18ff0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
19000 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
19010 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
19020 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
19030 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
19040 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
19050 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
19060 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
19070 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
19080 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
19090 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
190a0 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
190b0 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
190c0 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
190d0 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
190e0 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
190f0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
19100 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
19110 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
19120 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
19130 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
19140 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
19150 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
19160 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
19170 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
19180 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
19190 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
191a0 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
191b0 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
191c0 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
191d0 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
191e0 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
191f0 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
19200 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
19210 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
19220 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
19230 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
19240 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
19250 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
19260 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
19270 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
19280 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
19290 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
192a0 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
192b0 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
192c0 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
192d0 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
192e0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
192f0 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
19300 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
19310 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
19320 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
19330 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
19340 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
19350 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
19360 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
19370 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
19380 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20   .** pointed to 
19390 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65  by pCur have bee
193a0 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20  n zeroed by the 
193b0 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
193c0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
193d0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19400 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
19410 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
19420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19430 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
19440 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
19450 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
19460 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19480 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
19490 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
194a0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
194b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
194c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
194d0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
194e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
194f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
19520 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
19530 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
19540 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74  Pgno nPage;.  Bt
19550 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19560 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
19570 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
19580 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
19590 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
195a0 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
195b0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
195c0 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
195d0 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
195e0 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
195f0 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72 65 65   sharable b-tree
19600 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20  .  ** database, 
19610 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
19620 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
19630 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
19640 6b 73 2c 20 61 6e 64 20 74 68 61 74 0a 20 20 2a  ks, and that.  *
19650 2a 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65  * no other conne
19660 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70  ction has any op
19670 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63  en cursor that c
19680 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 74 68  onflicts with th
19690 69 73 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a 20 20  is lock..  **.  
196a0 2a 2a 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  ** The exception
196b0 20 74 6f 20 74 68 69 73 20 69 73 20 72 65 61 64   to this is read
196c0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 73 20 6f 70  -only cursors op
196d0 65 6e 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  en on the schema
196e0 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 20 53 75 63   table..  ** Suc
196f0 68 20 61 20 63 75 72 73 6f 72 20 69 73 20 6f 70  h a cursor is op
19700 65 6e 65 64 20 77 69 74 68 6f 75 74 20 61 20 6c  ened without a l
19710 6f 63 6b 20 77 68 69 6c 65 20 72 65 61 64 69 6e  ock while readin
19720 67 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  g the database. 
19730 20 2a 2a 20 73 63 68 65 6d 61 2e 20 54 68 69 73   ** schema. This
19740 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
19750 20 42 74 53 68 61 72 65 64 2e 6d 75 74 65 78 20   BtShared.mutex 
19760 69 73 20 68 65 6c 64 20 66 6f 72 20 74 68 65 20  is held for the 
19770 65 6e 74 69 72 65 0a 20 20 2a 2a 20 6c 69 66 65  entire.  ** life
19780 74 69 6d 65 20 6f 66 20 74 68 69 73 20 63 75 72  time of this cur
19790 73 6f 72 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  sor.  */.  asser
197a0 74 28 20 28 69 54 61 62 6c 65 3d 3d 31 20 26 26  t( (iTable==1 &&
197b0 20 77 72 46 6c 61 67 3d 3d 30 29 20 0a 20 20 20   wrFlag==0) .   
197c0 20 20 20 20 7c 7c 20 68 61 73 53 68 61 72 65 64      || hasShared
197d0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
197e0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
197f0 66 6f 21 3d 30 2c 20 77 72 46 6c 61 67 2b 31 29  fo!=0, wrFlag+1)
19800 20 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28   .  );.  assert(
19810 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
19820 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
19830 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
19840 20 69 66 28 20 4e 45 56 45 52 28 77 72 46 6c 61   if( NEVER(wrFla
19850 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64 4f 6e  g && pBt->readOn
19860 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ly) ){.    retur
19870 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
19880 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42  Y;.  }..  if( pB
19890 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
198a0 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72      rc = lockBtr
198b0 65 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a  eeWithRetry(p);.
198c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
198d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
198e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
198f0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
19900 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
19910 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ble;.  rc = sqli
19920 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
19930 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28  t(pBt->pPager, (
19940 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b 20 0a  int *)&nPage); .
19950 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19960 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
19970 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
19980 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e 50 61  iTable==1 && nPa
19990 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ge==0 ){.    rc 
199a0 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a  = SQLITE_EMPTY;.
199b0 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
199c0 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
199d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65 74  ;.  }.  rc = get
199e0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
199f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
19a00 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
19a10 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ]);.  if( rc!=SQ
19a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
19a30 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
19a40 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
19a50 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
19a60 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
19a70 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
19a80 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
19a90 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
19aa0 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74  ariables, link t
19ab0 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
19ac0 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
19ad0 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20   and set *ppCur 
19ae0 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74  (the.  ** output
19af0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
19b00 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a  s function)..  *
19b10 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  /.  pCur->pKeyIn
19b20 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
19b30 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
19b40 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
19b50 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
19b60 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46 6c 61  Flag = (u8)wrFla
19b70 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  g;.  pCur->pNext
19b80 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
19b90 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65  .  if( pCur->pNe
19ba0 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  xt ){.    pCur->
19bb0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
19bc0 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  Cur;.  }.  pBt->
19bd0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a  pCursor = pCur;.
19be0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
19bf0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
19c00 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65 64 52  .  pCur->cachedR
19c10 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74  owid = 0;..  ret
19c20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
19c30 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
19c40 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61  ception:.  relea
19c50 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
19c60 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63  age[0]);.  unloc
19c70 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
19c80 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Bt);.  return rc
19c90 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
19ca0 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
19cb0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
19cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19ce0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
19cf0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
19d20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
19d30 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
19d40 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
19d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d60 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
19d70 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
19d80 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
19d90 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
19da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19db0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
19dc0 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
19dd0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
19de0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
19df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e00 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
19e10 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
19e20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
19e30 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
19e40 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
19e50 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
19e60 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
19e70 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
19e80 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19e90 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19ea0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19eb0 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
19ec0 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
19ed0 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
19ee0 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
19ef0 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
19f00 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
19f10 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
19f20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
19f30 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
19f40 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
19f50 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
19f60 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
19f70 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
19f80 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
19f90 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
19fa0 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
19fb0 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
19fc0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
19fd0 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
19fe0 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
19ff0 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 2f  (BtCursor);.}../
1a000 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61 63  *.** Set the cac
1a010 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65 20  hed rowid value 
1a020 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  of every cursor 
1a030 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
1a040 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73 20  base file.** as 
1a050 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67 20  pCur and having 
1a060 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61  the same root pa
1a070 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43 75  ge number as pCu
1a080 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 73  r.  The value is
1a090 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77 69  .** set to iRowi
1a0a0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70 6f  d..**.** Only po
1a0b0 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61 6c  sitive rowid val
1a0c0 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  ues are consider
1a0d0 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68 69  ed valid for thi
1a0e0 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65 20  s cache..** The 
1a0f0 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61 6c  cache is initial
1a100 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69 6e  ized to zero, in
1a110 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76 61  dicating an inva
1a120 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41 20  lid cache..** A 
1a130 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b 20  btree will work 
1a140 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20 6f  fine with zero o
1a150 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64  r negative rowid
1a160 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e 6e  s.  We just cann
1a170 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72 6f  ot.** cache zero
1a180 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1a190 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e 73  ids, which means
1a1a0 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73 65   tables that use
1a1b0 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67 61   zero or.** nega
1a1c0 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67 68  tive rowids migh
1a1d0 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
1a1e0 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20 70  lower.  But in p
1a1f0 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a 2a  ractice, zero.**
1a200 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1a210 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e 63  ids are very unc
1a220 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73 68  ommon so this sh
1a230 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70 72  ould not be a pr
1a240 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
1a250 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
1a260 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72 73  chedRowid(BtCurs
1a270 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74 65  or *pCur, sqlite
1a280 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29 7b  3_int64 iRowid){
1a290 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
1a2a0 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70 42    for(p=pCur->pB
1a2b0 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
1a2c0 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
1a2d0 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d  if( p->pgnoRoot=
1a2e0 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
1a2f0 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69 64  ) p->cachedRowid
1a300 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 20   = iRowid;.  }. 
1a310 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
1a320 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f 77  achedRowid==iRow
1a330 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  id );.}../*.** R
1a340 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65 64  eturn the cached
1a350 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 67   rowid for the g
1a360 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41 20  iven cursor.  A 
1a370 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72 6f  negative or zero
1a380 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
1a390 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
1a3a0 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65 20  the rowid cache 
1a3b0 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  is invalid and s
1a3c0 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e 6f  hould be.** igno
1a3d0 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f 77  red.  If the row
1a3e0 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65 76  id cache has nev
1a3f0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 73  er before been s
1a400 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a 65  et, then a.** ze
1a410 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ro is returned..
1a420 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  */.sqlite3_int64
1a430 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a440 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1a450 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
1a460 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63 68  eturn pCur->cach
1a470 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  edRowid;.}../*.*
1a480 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
1a490 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
1a4a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1a4b0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
1a4c0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
1a4d0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
1a4e0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
1a4f0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
1a500 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
1a510 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
1a520 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
1a530 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
1a540 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
1a550 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
1a560 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
1a570 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1a580 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
1a590 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1a5a0 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1a5b0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
1a5c0 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
1a5d0 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
1a5e0 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
1a5f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a600 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
1a610 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
1a620 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1a630 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
1a640 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
1a650 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
1a660 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
1a670 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1a680 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
1a690 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
1a6a0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
1a6b0 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
1a6c0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
1a6d0 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  );.    invalidat
1a6e0 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
1a6f0 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  Cur);.    /* sql
1a700 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
1a710 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
1a720 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
1a730 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1a740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1a750 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1a760 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65  ./*.** Make a te
1a770 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62  mporary cursor b
1a780 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  y filling in the
1a790 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70   fields of pTemp
1a7a0 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70  Cur..** The temp
1a7b0 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69 73 20  orary cursor is 
1a7c0 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f  not on the curso
1a7d0 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42  r list for the B
1a7e0 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
1a7f0 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65 6d  lite3BtreeGetTem
1a800 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
1a810 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72   *pCur, BtCursor
1a820 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 69   *pTempCur){.  i
1a830 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
1a840 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1a850 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63  (pCur) );.  memc
1a860 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75  py(pTempCur, pCu
1a870 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75 72 73  r, sizeof(BtCurs
1a880 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72  or));.  pTempCur
1a890 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
1a8a0 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d  TempCur->pPrev =
1a8b0 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
1a8c0 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50 61 67  <=pTempCur->iPag
1a8d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  e; i++){.    sql
1a8e0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
1a8f0 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  mpCur->apPage[i]
1a900 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
1a910 20 20 61 73 73 65 72 74 28 20 70 54 65 6d 70 43    assert( pTempC
1a920 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d  ur->pKey==0 );.}
1a930 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a940 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66 64 65  E_TEST */..#ifde
1a950 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1a960 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d  .** Delete a tem
1a970 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75  porary cursor su
1a980 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62  ch as was made b
1a990 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70  y the CreateTemp
1a9a0 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a  oraryCursor().**
1a9b0 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e   function above.
1a9c0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a9d0 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
1a9e0 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
1a9f0 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
1aa00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1aa10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1aa20 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
1aa30 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
1aa40 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1aa50 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75 72  3PagerUnref(pCur
1aa60 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62  ->apPage[i]->pDb
1aa70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Page);.  }.  sql
1aa80 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
1aa90 70 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  pKey);.}.#endif 
1aaa0 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
1aab0 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  /../*.** Make su
1aac0 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
1aad0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
1aae0 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
1aaf0 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
1ab00 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
1ab10 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
1ab20 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
1ab30 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
1ab40 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
1ab50 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
1ab60 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
1ab70 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
1ab80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
1ab90 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
1aba0 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
1abb0 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
1abc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
1abd0 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
1abe0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a  eParseCell()..**
1abf0 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20  .** 2007-06-25: 
1ac00 20 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20   There is a bug 
1ac10 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  in some versions
1ac20 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61   of MSVC that ca
1ac30 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  use the.** compi
1ac40 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65  ler to crash whe
1ac50 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20  n getCellInfo() 
1ac60 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
1ac70 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75  s a macro..** Bu
1ac80 74 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61  t there is a mea
1ac90 73 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61  sureable speed a
1aca0 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e  dvantage to usin
1acb0 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67  g the macro on g
1acc0 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73  cc.** (when less
1acd0 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69   compiler optimi
1ace0 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73  zations like -Os
1acf0 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64   or -O0 are used
1ad00 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70   and the.** comp
1ad10 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e  iler is not doin
1ad20 67 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69  g agressive inli
1ad30 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73  ning.)  So we us
1ad40 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  e a real functio
1ad50 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e  n.** for MSVC an
1ad60 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76  d a macro for ev
1ad70 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20  erything else.  
1ad80 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f  Ticket #2457..*/
1ad90 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ada0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
1adb0 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
1adc0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1add0 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1ade0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
1adf0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
1ae00 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
1ae10 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
1ae20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
1ae30 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
1ae40 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
1ae50 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61   pCur->aiIdx[iPa
1ae60 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ge], &info);.   
1ae70 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
1ae80 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
1ae90 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
1aea0 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
1aeb0 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
1aec0 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
1aed0 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53 43  ndif.#ifdef _MSC
1aee0 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61 20  _VER.  /* Use a 
1aef0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69 6e  real function in
1af00 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61 72   MSVC to work ar
1af10 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68 61  ound bugs in tha
1af20 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a 20  t compiler. */. 
1af30 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74   static void get
1af40 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
1af50 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69 66  r *pCur){.    if
1af60 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
1af70 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ze==0 ){.      i
1af80 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
1af90 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20 73 71  >iPage;.      sq
1afa0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
1afb0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
1afc0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
1afd0 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
1afe0 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  ->info);.      p
1aff0 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1b000 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
1b010 20 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49       assertCellI
1b020 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  nfo(pCur);.    }
1b030 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  .  }.#else /* if
1b040 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f   not _MSC_VER */
1b050 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61 63 72  .  /* Use a macr
1b060 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63  o in all other c
1b070 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68 61 74  ompilers so that
1b080 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
1b090 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66   inlined */.#def
1b0a0 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ine getCellInfo(
1b0b0 70 43 75 72 29 20 20 20 20 20 20 20 20 20 20 20  pCur)           
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
1b0f0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
1b100 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b130 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1b140 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
1b150 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20 20 20  ur->iPage;      
1b160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b190 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
1b1a0 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1b1b0 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1b1c0 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1b1d0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 5c 0a  &pCur->info); \.
1b1e0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1b1f0 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Key = 1;        
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1b230 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b280 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c  \.    assertCell
1b290 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20  Info(pCur);     
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2d0 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   \.  }.#endif /*
1b2e0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a   _MSC_VER */../*
1b2f0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1b300 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
1b310 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
1b320 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
1b330 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
1b340 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1b350 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
1b360 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
1b370 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
1b380 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
1b390 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
1b3a0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
1b3b0 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
1b3c0 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
1b3d0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1b3e0 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
1b3f0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
1b400 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
1b410 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  he key..*/.int s
1b420 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
1b430 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
1b440 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
1b450 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1b460 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1b470 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1b480 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
1b490 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1b4a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1b4b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
1b4c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b4d0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1b4e0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
1b4f0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b500 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
1b510 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b520 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1b530 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
1b540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
1b550 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1b560 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
1b570 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1b580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b590 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b5a0 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20  * Set *pSize to 
1b5b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b5c0 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74  tes of data in t
1b5d0 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20  he entry the.** 
1b5e0 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79  cursor currently
1b5f0 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77   points to.  Alw
1b600 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ays return SQLIT
1b610 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65  E_OK..** Failure
1b620 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1b630 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1b640 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c   is not currentl
1b650 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  y.** pointing to
1b660 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68   an entry (which
1b670 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72   can happen, for
1b680 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20   example, if.** 
1b690 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1b6a0 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69  empty) then *pSi
1b6b0 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ze is set to 0..
1b6c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b6d0 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
1b6e0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
1b6f0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1b700 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  c;..  assert( cu
1b710 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1b720 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1b730 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1b740 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1b750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b760 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b770 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b780 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
1b790 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1b7a0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
1b7b0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b7c0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b7d0 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  D ){.      /* No
1b7e0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
1b7f0 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65  valid entry - se
1b800 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a  t *pSize to 0. *
1b810 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  /.      *pSize =
1b820 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1b830 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1b840 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70  (pCur);.      *p
1b850 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
1b860 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  o.nData;.    }. 
1b870 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b880 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1b890 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
1b8a0 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  f an overflow pa
1b8b0 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
1b8c0 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a  se (parameter.**
1b8d0 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e   ovfl), this fun
1b8e0 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20  ction finds the 
1b8f0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1b900 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
1b910 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c  the .** linked l
1b920 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ist of overflow 
1b930 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62  pages. If possib
1b940 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20  le, it uses the 
1b950 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70  auto-vacuum.** p
1b960 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20  ointer-map data 
1b970 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69  instead of readi
1b980 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ng the content o
1b990 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64  f page ovfl to d
1b9a0 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  o so. .**.** If 
1b9b0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1b9c0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1b9d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1b9e0 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a  . Otherwise:.**.
1b9f0 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  ** The page numb
1ba00 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
1ba10 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1ba20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1ba30 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74  is .** written t
1ba40 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
1ba50 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68   page ovfl is th
1ba60 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
1ba70 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69  ts linked .** li
1ba80 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69  st, *pPgnoNext i
1ba90 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a  s set to zero. .
1baa0 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20  **.** If ppPage 
1bab0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64  is not NULL, and
1bac0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
1bad0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
1bae0 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ct corresponding
1baf0 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  .** to page numb
1bb00 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74  er pOvfl was obt
1bb10 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50  ained, then *ppP
1bb20 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f  age is set to po
1bb30 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72  int to that.** r
1bb40 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20  eference. It is 
1bb50 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
1bb60 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
1bb70 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65   to call release
1bb80 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70  Page().** on *pp
1bb90 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65  Page to free the
1bba0 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e   reference. In n
1bbb0 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
1bbc0 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73  obtained (becaus
1bbd0 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72  e.** the pointer
1bbe0 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f  -map was used to
1bbf0 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75   obtain the valu
1bc00 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74  e for *pPgnoNext
1bc10 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61  ), then.** *ppPa
1bc20 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ge is set to zer
1bc30 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
1bc40 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1bc50 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1bc60 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c  t, .  Pgno ovfl,
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc80 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
1bc90 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  age */.  MemPage
1bca0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
1bcb0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65        /* OUT: Me
1bcc0 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61  mPage handle (ma
1bcd0 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20  y be NULL) */.  
1bce0 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd00 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
1bd10 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
1bd20 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
1bd30 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1bd40 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e  *pPage = 0;.  in
1bd50 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bd60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1bd70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1bd80 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1bd90 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78   assert(pPgnoNex
1bda0 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  t);..#ifndef SQL
1bdb0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1bdc0 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  UUM.  /* Try to 
1bdd0 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61  find the next pa
1bde0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1bdf0 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68  ow list using th
1be00 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75  e.  ** autovacuu
1be10 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  m pointer-map pa
1be20 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74 20  ges. Guess that 
1be30 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1be40 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66   .  ** the overf
1be50 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67 65  low list is page
1be60 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29   number (ovfl+1)
1be70 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73 20  . If that guess 
1be80 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20  turns .  ** out 
1be90 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c  to be wrong, fal
1bea0 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e  l back to loadin
1beb0 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70 61  g the data of pa
1bec0 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  ge .  ** number 
1bed0 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e  ovfl to determin
1bee0 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  e the next page 
1bef0 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69  number..  */.  i
1bf00 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
1bf10 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
1bf20 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47  gno;.    Pgno iG
1bf30 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20  uess = ovfl+1;. 
1bf40 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20     u8 eType;..  
1bf50 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
1bf60 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75 65  ISPAGE(pBt, iGue
1bf70 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50  ss) || iGuess==P
1bf80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1bf90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69  (pBt) ){.      i
1bfa0 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Guess++;.    }..
1bfb0 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d      if( iGuess<=
1bfc0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
1bfd0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Bt) ){.      rc 
1bfe0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1bff0 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c   iGuess, &eType,
1c000 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69   &pgno);.      i
1c010 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c020 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   && eType==PTRMA
1c030 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70  P_OVERFLOW2 && p
1c040 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20  gno==ovfl ){.   
1c050 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65       next = iGue
1c060 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ss;.        rc =
1c070 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
1c080 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1c090 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63  #endif..  if( rc
1c0a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1c0b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c0c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1c0d0 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 30   ovfl, &pPage, 0
1c0e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63  );.    assert(rc
1c0f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1c100 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66  Page==0);.    if
1c110 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d  ( next==0 && rc=
1c120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c130 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
1c140 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
1c150 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1c160 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
1c170 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
1c180 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
1c190 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
1c1a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1c1b0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
1c1c0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
1c1d0 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
1c1e0 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
1c1f0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
1c200 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
1c210 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
1c220 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
1c230 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
1c240 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1c250 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
1c260 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1c270 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
1c280 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
1c290 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
1c2a0 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
1c2b0 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
1c2c0 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
1c2d0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
1c2e0 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
1c2f0 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
1c300 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
1c310 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
1c320 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
1c330 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
1c340 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
1c350 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
1c360 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
1c370 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
1c380 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1c390 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
1c3a0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
1c3b0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
1c3c0 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
1c3d0 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
1c3e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1c3f0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
1c400 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
1c410 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1c420 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1c430 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
1c440 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
1c450 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c460 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
1c470 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
1c4a0 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
1c4b0 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
1c4c0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
1c4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
1c4e0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
1c4f0 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
1c500 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
1c510 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
1c520 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
1c530 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
1c540 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
1c550 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1c560 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
1c570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c580 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1c590 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1c5a0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
1c5b0 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
1c5c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1c5d0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
1c5e0 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
1c5f0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
1c600 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
1c610 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
1c620 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
1c630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c640 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1c650 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
1c660 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
1c670 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
1c680 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
1c690 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1c6a0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
1c6b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66   pointing to. If
1c6c0 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61   the eOp.** para
1c6d0 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 69 73  meter is 0, this
1c6e0 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
1c6f0 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65  tion (data copie
1c700 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72  d into.** buffer
1c710 20 70 42 75 66 29 2e 20 49 66 20 69 74 20 69 73   pBuf). If it is
1c720 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69   non-zero, a wri
1c730 74 65 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  te (data copied 
1c740 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70  from.** buffer p
1c750 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f  Buf)..**.** A to
1c760 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74  tal of "amt" byt
1c770 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20 77  es are read or w
1c780 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67  ritten beginning
1c790 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1c7a0 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74 6f   Data is read to
1c7b0 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66   or from the buf
1c7c0 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
1c7d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1c7e0 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73  s not make a dis
1c7f0 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e  tinction between
1c800 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a   key and data..*
1c810 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64 73 20  * It just reads 
1c820 6f 72 20 77 72 69 74 65 73 20 62 79 74 65 73 20  or writes bytes 
1c830 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64  from the payload
1c840 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67   area.  Data mig
1c850 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e  ht .** appear on
1c860 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f   the main page o
1c870 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
1c880 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
1c890 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
1c8a0 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
1c8b0 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62  BtCursor.isIncrb
1c8c0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1c8d0 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63  s set, and the c
1c8e0 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72  urrent.** cursor
1c8f0 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
1c900 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
1c910 20 70 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e   pages, this fun
1c920 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74  ction.** allocat
1c930 65 73 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  es space for and
1c940 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65   lazily popluate
1c950 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  s the overflow p
1c960 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63  age-list .** cac
1c970 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
1c980 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53  or.aOverflow). S
1c990 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1c9a0 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68  use this.** cach
1c9b0 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e  e to make seekin
1c9c0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
1c9d0 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66  d offset more ef
1c9e0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
1c9f0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
1ca00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1ca10 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1ca20 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
1ca30 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
1ca40 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
1ca50 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
1ca60 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
1ca70 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
1ca80 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
1ca90 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
1caa0 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
1cab0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
1cac0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1cad0 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
1cae0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
1caf0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1cb00 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
1cb10 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1cb20 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
1cb30 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
1cb40 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
1cb50 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
1cb60 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
1cb70 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
1cb80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
1cb90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
1cba0 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
1cbb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
1cbc0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
1cbd0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
1cbe0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1cbf0 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
1cc00 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
1cc10 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
1cc20 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
1cc30 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
1cc40 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
1cc50 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
1cc60 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
1cc70 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
1cc80 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
1cc90 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
1cca0 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c   .  int skipKey,
1ccb0 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73           /* offs
1ccc0 65 74 20 62 65 67 69 6e 73 20 61 74 20 64 61 74  et begins at dat
1ccd0 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
1cce0 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20  e */.  int eOp  
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a              /* z
1cd00 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e  ero to read. non
1cd10 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20  -zero to write. 
1cd20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  */.){.  unsigned
1cd30 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b   char *aPayload;
1cd40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1cd50 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65  TE_OK;.  u32 nKe
1cd60 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  y;.  int iIdx = 
1cd70 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
1cd80 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1cd90 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1cda0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
1cdb0 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
1cdc0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1cdd0 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdf0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
1ce00 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
1ce10 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1ce20 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
1ce30 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ce40 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1ce50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ce60 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1ce70 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
1ce80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1ce90 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1cea0 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
1ceb0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
1cec0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
1ced0 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
1cee0 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
1cef0 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
1cf00 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 28  ->intKey ? 0 : (
1cf10 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
1cf20 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69  Key);..  if( ski
1cf30 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73  pKey ){.    offs
1cf40 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a  et += nKey;.  }.
1cf50 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1cf60 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e   > nKey+pCur->in
1cf70 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c 7c 20  fo.nData .   || 
1cf80 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1cf90 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
1cfa0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
1cfb0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
1cfc0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
1cfd0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1cfe0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
1cff0 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
1d000 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
1d010 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1d020 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1d030 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
1d040 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
1d050 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
1d060 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
1d070 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
1d080 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
1d090 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
1d0a0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
1d0b0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
1d0c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
1d0d0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
1d0e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1d0f0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
1d100 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1d110 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1d120 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
1d130 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
1d140 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
1d150 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
1d160 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
1d170 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
1d180 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
1d190 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
1d1a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d1b0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
1d1c0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
1d1d0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
1d1e0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
1d1f0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
1d200 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
1d210 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
1d220 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
1d230 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
1d240 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
1d250 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
1d260 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1d270 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
1d280 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
1d290 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
1d2a0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
1d2b0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
1d2c0 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
1d2d0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
1d2e0 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
1d2f0 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
1d300 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
1d310 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
1d320 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
1d330 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
1d340 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
1d350 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1d360 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
1d370 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
1d380 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
1d390 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
1d3a0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
1d3b0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
1d3c0 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
1d3d0 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
1d3e0 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
1d3f0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
1d400 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
1d410 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
1d420 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
1d430 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
1d440 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
1d450 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
1d460 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
1d470 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
1d480 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
1d490 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
1d4a0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
1d4b0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1d4c0 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
1d4d0 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
1d4e0 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
1d4f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
1d500 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1d510 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
1d520 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1d530 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
1d540 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1d550 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
1d560 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
1d570 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
1d580 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
1d590 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
1d5a0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
1d5b0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
1d5c0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
1d5d0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
1d5e0 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
1d5f0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
1d600 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
1d610 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
1d620 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
1d630 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
1d640 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
1d650 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
1d660 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
1d670 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1d680 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
1d690 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1d6a0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
1d6b0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
1d6c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1d6d0 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
1d6e0 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
1d6f0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
1d700 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
1d710 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
1d720 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1d730 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1d740 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
1d750 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
1d760 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1d770 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
1d780 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
1d790 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
1d7a0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
1d7b0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
1d7c0 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
1d7d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
1d7e0 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
1d7f0 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
1d800 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
1d810 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
1d820 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
1d830 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
1d840 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
1d850 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
1d860 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
1d870 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
1d880 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
1d890 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
1d8a0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
1d8b0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
1d8c0 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
1d8d0 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
1d8e0 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
1d8f0 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
1d900 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
1d910 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d920 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1d930 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1d940 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
1d950 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1d960 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
1d970 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
1d980 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
1d990 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
1d9a0 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
1d9b0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
1d9c0 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
1d9d0 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
1d9e0 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
1d9f0 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
1da00 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
1da10 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
1da20 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
1da30 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
1da40 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
1da50 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1da60 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
1da70 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
1da80 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
1da90 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
1daa0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1dab0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1dac0 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
1dad0 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
1dae0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1daf0 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
1db00 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
1db10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
1db20 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1db30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
1db40 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
1db50 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
1db60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1db70 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
1db80 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
1db90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
1dba0 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
1dbb0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1dbc0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
1dbd0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1dbe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dbf0 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
1dc00 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
1dc10 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
1dc20 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
1dc30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1dc40 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
1dc50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
1dc60 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
1dc70 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
1dc80 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
1dc90 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
1dca0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1dcb0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1dcc0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
1dcd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1dce0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1dcf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1dd00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
1dd10 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
1dd20 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
1dd30 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
1dd40 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
1dd50 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
1dd60 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
1dd70 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
1dd80 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
1dd90 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
1dda0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1ddb0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
1ddc0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
1ddd0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
1dde0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
1ddf0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
1de00 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
1de10 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
1de20 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
1de30 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
1de40 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
1de50 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1de60 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1de70 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1de80 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1de90 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1dea0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1deb0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
1dec0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1ded0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1dee0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1def0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1df00 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1df10 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1df20 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1df30 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1df40 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
1df50 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70 50 61    if( pCur->apPa
1df60 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 29 7b  ge[0]->intKey ){
1df70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1df80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1df90 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
1dfa0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1dfb0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1dfc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1dfd0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1dfe0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
1dff0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1e000 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
1e010 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
1e020 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
1e030 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e040 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
1e050 74 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61  the data associa
1e060 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
1e070 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a  pCur.  Exactly.*
1e080 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69  * "amt" bytes wi
1e090 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64  ll be transfered
1e0a0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
1e0b0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
1e0c0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
1e0d0 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  "..**.** Return 
1e0e0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
1e0f0 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
1e100 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e   code if anythin
1e110 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1e120 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65    An error is re
1e130 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65  turned if "offse
1e140 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72  t+amt" is larger
1e150 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61   than.** the ava
1e160 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a  ilable payload..
1e170 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1e180 72 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72  reeData(BtCursor
1e190 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
1e1a0 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
1e1b0 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20  d *pBuf){.  int 
1e1c0 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  rc;..#ifndef SQL
1e1d0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1e1e0 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65  B.  if ( pCur->e
1e1f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
1e200 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
1e210 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  urn SQLITE_ABORT
1e220 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1e230 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1e240 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1e250 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
1e260 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1e270 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1e280 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e290 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1e2a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1e2b0 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
1e2c0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  t( pCur->iPage>=
1e2d0 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67  0 && pCur->apPag
1e2e0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
1e2f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
1e300 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e310 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
1e320 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e330 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
1e340 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
1e350 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
1e360 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20 30 29  amt, pBuf, 1, 0)
1e370 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1e380 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
1e390 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1e3a0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
1e3b0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
1e3c0 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
1e3d0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
1e3e0 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
1e3f0 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
1e400 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
1e410 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 73 6b  ** the key if sk
1e420 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69 74 20  ipKey==0 and it 
1e430 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 65  points to the be
1e440 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
1e450 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d 3d 31  if.** skipKey==1
1e460 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  .  The number of
1e470 20 62 79 74 65 73 20 6f 66 20 61 76 61 69 6c 61   bytes of availa
1e480 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69 73 20  ble key/data is 
1e490 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
1e4a0 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41 6d 74  *pAmt.  If *pAmt
1e4b0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ==0, then the va
1e4c0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  lue returned wil
1e4d0 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20 76 61  l not be.** a va
1e4e0 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  lid pointer..**.
1e4f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e500 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
1e510 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d 6d 6f  on.  It is commo
1e520 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72 65  n for the entire
1e530 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61 74 61   key.** and data
1e540 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 6c   to fit on the l
1e550 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20 66 6f  ocal page and fo
1e560 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 6e 6f  r there to be no
1e570 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67   overflow.** pag
1e580 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74 20 69  es.  When that i
1e590 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75 74 69  s so, this routi
1e5a0 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  ne can be used t
1e5b0 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a 2a 20  o access the.** 
1e5c0 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77 69 74  key and data wit
1e5d0 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20 63 6f  hout making a co
1e5e0 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65 79 20  py.  If the key 
1e5f0 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70 69 6c  and/or data spil
1e600 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65 72 66  ls.** onto overf
1e610 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65 6e 20  low pages, then 
1e620 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
1e630 6d 75 73 74 20 62 65 20 75 73 65 64 20 74 6f 20  must be used to 
1e640 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20 74 68  reassemble.** th
1e650 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64 20 63  e key/data and c
1e660 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20 70 72  opy it into a pr
1e670 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66 66 65  eallocated buffe
1e680 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69  r..**.** The poi
1e690 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
1e6a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f   this routine lo
1e6b0 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69 6e 74  oks directly int
1e6c0 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a 2a 20  o the cached.** 
1e6d0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
1e6e0 62 61 73 65 2e 20 20 54 68 65 20 64 61 74 61 20  base.  The data 
1e6f0 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 72 20  might change or 
1e700 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20 74 69  move the next ti
1e710 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65 65 20  me.** any btree 
1e720 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e730 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  d..*/.static con
1e740 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e750 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
1e760 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1e770 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
1e780 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
1e790 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
1e7a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74 2c 20  */.  int *pAmt, 
1e7b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1e7c0 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
1e7d0 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
1e7e0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73   here */.  int s
1e7f0 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20 20 20  kipKey          
1e800 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e 69 6e  /* read beginnin
1e810 67 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69  g at data if thi
1e820 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  s is true */.){.
1e830 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1e840 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d  *aPayload;.  Mem
1e850 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 75  Page *pPage;.  u
1e860 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32 20 6e  32 nKey;.  u32 n
1e870 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65 72 74  Local;..  assert
1e880 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
1e890 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
1e8a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1e8b0 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
1e8c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1e8d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1e8e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
1e8f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e900 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
1e910 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1e920 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
1e930 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
1e940 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
1e950 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1e960 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1e970 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
1e980 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
1e990 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d  l;.  aPayload +=
1e9a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
1e9b0 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65  der;.  if( pPage
1e9c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1e9d0 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nKey = 0;.  }els
1e9e0 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 28 69  e{.    nKey = (i
1e9f0 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
1ea00 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b  ey;.  }.  if( sk
1ea10 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61  ipKey ){.    aPa
1ea20 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20  yload += nKey;. 
1ea30 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
1ea40 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
1ea50 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nKey;.  }else{. 
1ea60 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72     nLocal = pCur
1ea70 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
1ea80 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b     if( nLocal>nK
1ea90 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63  ey ){.      nLoc
1eaa0 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d  al = nKey;.    }
1eab0 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e  .  }.  *pAmt = n
1eac0 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20  Local;.  return 
1ead0 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  aPayload;.}.../*
1eae0 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
1eaf0 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
1eb00 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
1eb10 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
1eb20 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
1eb30 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
1eb40 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
1eb50 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
1eb60 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
1eb70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
1eb80 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
1eb90 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
1eba0 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
1ebb0 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
1ebc0 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
1ebd0 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
1ebe0 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
1ebf0 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
1ec00 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
1ec10 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
1ec20 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
1ec30 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
1ec40 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
1ec50 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
1ec60 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
1ec70 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
1ec80 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
1ec90 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
1eca0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
1ecb0 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
1ecc0 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
1ecd0 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
1ece0 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
1ecf0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
1ed00 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
1ed10 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
1ed20 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
1ed30 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
1ed40 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
1ed50 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20  , int *pAmt){.  
1ed60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ed70 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1ed80 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1ed90 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1eda0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1edb0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28  x(pCur) );.  if(
1edc0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1edd0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
1ede0 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74     return (const
1edf0 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c   void*)fetchPayl
1ee00 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20  oad(pCur, pAmt, 
1ee10 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1ee20 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64   0;.}.const void
1ee30 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
1ee40 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
1ee50 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
1ee60 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1ee70 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ee80 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1ee90 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
1eea0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1eeb0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1eec0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
1eed0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1eee0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
1eef0 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74  (const void*)fet
1ef00 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
1ef10 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  pAmt, 1);.  }.  
1ef20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a  return 0;.}.../*
1ef30 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
1ef40 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
1ef50 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
1ef60 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
1ef70 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
1ef80 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
1ef90 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
1efa0 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69  ove to..*/.stati
1efb0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c  c int moveToChil
1efc0 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
1efd0 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a  , u32 newPgno){.
1efe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1eff0 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  i = pCur->iPage;
1f000 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77  .  MemPage *pNew
1f010 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
1f020 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
1f030 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
1f040 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f050 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1f060 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1f070 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1f080 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1f090 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
1f0a0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 69 66  AX_DEPTH );.  if
1f0b0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
1f0c0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
1f0d0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
1f0e0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f0f0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1f100 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
1f110 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
1f120 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20 20 69   &pNewPage);.  i
1f130 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1f140 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  c;.  pCur->apPag
1f150 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50 61 67  e[i+1] = pNewPag
1f160 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  e;.  pCur->aiIdx
1f170 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70 43 75  [i+1] = 0;.  pCu
1f180 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20 20 70  r->iPage++;..  p
1f190 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1f1a0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1f1b0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1f1c0 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65 6c  ( pNewPage->nCel
1f1d0 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72  l<1 ){.    retur
1f1e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1f1f0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1f200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1f210 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1f220 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
1f230 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
1f240 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
1f250 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
1f260 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
1f270 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
1f280 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
1f290 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
1f2a0 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
1f2b0 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
1f2c0 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
1f2d0 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
1f2e0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
1f2f0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
1f300 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
1f310 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
1f320 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
1f330 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
1f340 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f350 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1f360 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
1f370 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
1f380 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 61 73  no iChild){.  as
1f390 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
1f3a0 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
1f3b0 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
1f3c0 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
1f3d0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1f3e0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
1f3f0 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
1f400 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
1f410 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f420 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
1f430 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
1f440 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
1f450 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
1f460 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
1f470 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
1f480 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
1f490 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1f4a0 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1f4b0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1f4c0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1f4d0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1f4e0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1f4f0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1f500 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1f510 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1f520 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1f530 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1f540 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1f550 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1f560 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1f570 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1f580 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1f590 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
1f5a0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1f5b0 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
1f5c0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
1f5d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1f5e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1f5f0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1f600 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1f620 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20  ur->iPage>0 );. 
1f630 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
1f640 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1f650 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61  e] );.  assertPa
1f660 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70  rentIndex(.    p
1f670 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
1f680 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
1f690 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f6a0 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20  r->iPage-1], .  
1f6b0 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
1f6c0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e  Cur->iPage]->pgn
1f6d0 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  o.  );.  release
1f6e0 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
1f6f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
1f700 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
1f710 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1f720 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1f730 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1f740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1f750 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1f760 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74   root page.*/.st
1f770 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1f780 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
1f790 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1f7a0 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
1f7b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
1f7c0 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
1f7d0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
1f7e0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1f7f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1f800 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1f810 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1f820 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
1f830 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1f840 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1f850 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
1f860 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
1f870 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
1f880 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
1f890 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
1f8a0 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
1f8b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
1f8c0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1f8d0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1f8e0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f8f0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
1f900 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
1f910 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  p;.    }.    sql
1f920 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
1f930 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
1f940 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
1f950 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ge>=0 ){.    int
1f960 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   i;.    for(i=1;
1f970 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
1f980 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
1f990 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
1f9a0 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
1f9b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1f9c0 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ( .      SQLITE_
1f9d0 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64  OK!=(rc = getAnd
1f9e0 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 43  InitPage(pBt, pC
1f9f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
1fa00 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29  Cur->apPage[0]))
1fa10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43  .    ){.      pC
1fa20 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1fa30 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
1fa40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1fa50 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74    }.  }..  pRoot
1fa60 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1fa70 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  0];.  assert( pR
1fa80 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
1fa90 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70  >pgnoRoot );.  p
1faa0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a  Cur->iPage = 0;.
1fab0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
1fac0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1fad0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1fae0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
1faf0 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1fb00 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Key = 0;..  if( 
1fb10 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pRoot->nCell==0 
1fb20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  && !pRoot->leaf 
1fb30 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
1fb40 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
1fb50 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
1fb60 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1fb70 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
1fb80 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1fb90 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1fba0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1fbb0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1fbc0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1fbd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1fbe0 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1fbf0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1fc00 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1fc10 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1fc20 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1fc30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1fc40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
1fc50 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
1fc60 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1fc70 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1fc80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1fc90 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1fca0 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1fcb0 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
1fcc0 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1fcd0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
1fce0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1fcf0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1fd00 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
1fd10 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
1fd20 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
1fd30 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
1fd40 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
1fd50 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1fd60 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1fd70 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
1fd80 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1fd90 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1fda0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1fdb0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1fdc0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1fdd0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1fde0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1fdf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1fe00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1fe10 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1fe20 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1fe30 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1fe40 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1fe50 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
1fe60 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1fe70 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1fe80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1fe90 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1fea0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1feb0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1fec0 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
1fed0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1fee0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1fef0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ff00 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1ff10 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1ff20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1ff30 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1ff40 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1ff50 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1ff60 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1ff70 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1ff80 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1ff90 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1ffa0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1ffb0 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1ffc0 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1ffd0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1ffe0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1fff0 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
20000 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
20010 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
20020 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
20030 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
20040 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
20050 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
20060 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
20070 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
20080 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
20090 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
200a0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
200b0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
200c0 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
200d0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
200e0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
200f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
20100 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
20110 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
20120 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
20130 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
20140 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
20150 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
20160 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
20170 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
20180 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
20190 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
201a0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
201b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
201c0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
201d0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
201e0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
201f0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
20200 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
20210 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
20220 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
20230 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
20240 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
20250 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
20260 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
20270 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
20280 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
20290 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
202a0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
202b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
202c0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
202d0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
202e0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
202f0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
20300 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
20310 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
20320 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
20330 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
20340 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
20350 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
20360 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
20370 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
20380 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
20390 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
203a0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
203b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
203c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
203d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
203e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
203f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
20400 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
20410 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
20420 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
20430 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
20440 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
20450 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
20460 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
20470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
20480 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
20490 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
204a0 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
204b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
204c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
204d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
204e0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
204f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
20500 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
20510 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
20520 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
20530 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
20540 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20550 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
20560 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
20570 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
20580 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
20590 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
205a0 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
205b0 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
205c0 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
205d0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
205e0 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
205f0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
20600 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
20610 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
20620 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
20630 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
20640 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
20650 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
20660 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
20670 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
20680 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
20690 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
206a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
206b0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
206c0 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  or already point
206d0 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  s to the last en
206e0 74 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e  try, this is a n
206f0 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43  o-op. */.  if( C
20700 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
20710 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70 43 75  r->eState && pCu
20720 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23 69 66  r->atLast ){.#if
20730 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
20740 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  .    /* This blo
20750 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73 73  ck serves to ass
20760 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 63  ert() that the c
20770 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65  ursor really doe
20780 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20  s point .    ** 
20790 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
207a0 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e  y in the b-tree.
207b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
207c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
207d0 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69  <pCur->iPage; ii
207e0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
207f0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  t( pCur->aiIdx[i
20800 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  i]==pCur->apPage
20810 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  [ii]->nCell );. 
20820 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
20830 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20840 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d  r->iPage]==pCur-
20850 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
20860 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b  age]->nCell-1 );
20870 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
20880 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20890 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a  iPage]->leaf );.
208a0 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
208b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
208c0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
208d0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
208e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
208f0 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  {.    if( CURSOR
20900 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
20910 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
20920 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
20930 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
20940 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
20950 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
20960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20970 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
20980 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20990 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
209a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
209b0 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
209c0 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
209d0 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72  pCur->atLast = r
209e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 31 3a  c==SQLITE_OK ?1:
209f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
20a00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
20a10 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
20a20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
20a30 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
20a40 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
20a50 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
20a60 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
20a70 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
20a80 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
20a90 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
20aa0 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
20ab0 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
20ac0 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
20ad0 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
20ae0 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
20af0 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
20b00 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
20b10 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
20b20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
20b30 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
20b40 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
20b50 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
20b60 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
20b70 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
20b80 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
20b90 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
20ba0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
20bb0 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
20bc0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
20bd0 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
20be0 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
20bf0 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
20c00 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
20c10 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
20c20 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
20c30 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
20c40 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
20c50 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
20c60 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
20c70 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
20c80 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
20c90 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
20ca0 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
20cb0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
20cc0 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
20cd0 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
20ce0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
20cf0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
20d00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
20d10 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
20d20 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
20d30 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
20d40 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
20d70 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
20d80 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
20d90 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
20da0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
20db0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
20dc0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
20dd0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
20de0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
20df0 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
20e00 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
20e10 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
20e20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
20e30 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
20e40 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
20e50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
20e60 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
20e70 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
20e80 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
20e90 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
20ea0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
20eb0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
20ec0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
20ed0 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
20ee0 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20ef0 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
20f00 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
20f10 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
20f20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20f30 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
20f40 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
20f50 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
20f60 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
20f70 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
20f80 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
20f90 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
20fa0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
20fb0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
20fc0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
20fd0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
20fe0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
20ff0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
21000 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
21010 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
21020 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
21030 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
21040 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
21050 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
21060 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
21070 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
21080 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
21090 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
210a0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
210b0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
210c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
210d0 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
210e0 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26 20 70  lidNKey .   && p
210f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
21100 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20  intKey .  ){.   
21110 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
21120 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
21130 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
21140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
21160 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c     if( pCur->atL
21170 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66  ast && pCur->inf
21180 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
21190 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
211a0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
211b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
211c0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
211d0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
211e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
211f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21200 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
21210 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21220 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
21230 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
21240 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69 74  ->iPage]->isInit
21250 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
21260 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
21270 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
21280 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
21290 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
212a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
212b0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
212c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
212d0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
212e0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
212f0 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  ->intKey || pIdx
21300 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
21310 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
21320 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c  pr;.    Pgno chl
21330 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  dPg;.    MemPage
21340 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
21350 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
21360 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d  ge];.    int c =
21370 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72 65   -1;  /* pRes re
21380 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69 73  turn if table is
21390 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20 2d   empty must be -
213a0 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30  1 */.    lwr = 0
213b0 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67  ;.    upr = pPag
213c0 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20  e->nCell-1;.    
213d0 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69 6e 74  if( (!pPage->int
213e0 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79 3d 3d  Key && pIdxKey==
213f0 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b 0a 20  0) || upr<0 ){. 
21400 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21410 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
21420 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
21430 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20  _finish;.    }. 
21440 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74     if( biasRight
21450 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
21460 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
21470 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b 0a 20  e] = (u16)upr;. 
21480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21490 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
214a0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
214b0 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b 0a 20  ((upr+lwr)/2);. 
214c0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b 3b 29     }.    for(;;)
214d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20  {.      int idx 
214e0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
214f0 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 49  ur->iPage]; /* I
21500 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
21510 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
21520 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
21530 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
21550 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
21560 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
21570 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  /..      pCur->i
21580 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
21590 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
215a0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
215b0 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
215c0 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  PtrSize;.      i
215d0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
215e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
215f0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
21600 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
21610 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
21620 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20    u32 dummy;.   
21630 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20         pCell += 
21640 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c  getVarint32(pCel
21650 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  l, dummy);.     
21660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74     }.        get
21670 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75  Varint(pCell, (u
21680 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a  64*)&nCellKey);.
21690 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
216a0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  lKey==intKey ){.
216b0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b            c = 0;
216c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
216d0 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b  f( nCellKey<intK
216e0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
216f0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
21700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21710 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65   assert( nCellKe
21720 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  y>intKey );.    
21730 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20        c = +1;.  
21740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21750 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
21760 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 43 75  = 1;.        pCu
21770 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
21780 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 7d  CellKey;.      }
21790 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
217a0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 75 70   The maximum sup
217b0 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69 7a 65  ported page-size
217c0 20 69 73 20 33 32 37 36 38 20 62 79 74 65 73 2e   is 32768 bytes.
217d0 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
217e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
217f0 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
21800 66 20 72 65 63 6f 72 64 20 62 79 74 65 73 20 73  f record bytes s
21810 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65  tored on an inde
21820 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20 20 20  x B-Tree.       
21830 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74 20 6d   ** page is at m
21840 6f 73 74 20 38 31 39 38 20 62 79 74 65 73 2c 20  ost 8198 bytes, 
21850 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 74 6f  which may be sto
21860 72 65 64 20 61 73 20 61 20 32 2d 62 79 74 65 0a  red as a 2-byte.
21870 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72 69 6e          ** varin
21880 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  t. This informat
21890 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
218a0 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69 64 20  ttempt to avoid 
218b0 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20 20 20  parsing .       
218c0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63   ** the entire c
218d0 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e 67 20  ell by checking 
218e0 66 6f 72 20 74 68 65 20 63 61 73 65 73 20 77 68  for the cases wh
218f0 65 72 65 20 74 68 65 20 72 65 63 6f 72 64 20 69  ere the record i
21900 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  s .        ** st
21910 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20 77 69  ored entirely wi
21920 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65 65 20  thin the b-tree 
21930 70 61 67 65 20 62 79 20 69 6e 73 70 65 63 74 69  page by inspecti
21940 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a 20 20  ng the first .  
21950 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74 65 73        ** 2 bytes
21960 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20   of the cell..  
21970 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21980 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70 43 65   int nCell = pCe
21990 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
219a0 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30 78 38  f( !(nCell & 0x8
219b0 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70 50 61  0) && nCell<=pPa
219c0 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
219d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
219e0 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20 69 66  s branch runs if
219f0 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   the record-size
21a00 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 65   field of the ce
21a10 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20 20 20  ll is a.        
21a20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
21a30 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
21a40 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e 74 69  record fits enti
21a50 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
21a60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 2d  .          ** b-
21a70 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
21a80 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
21a90 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21aa0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
21ab0 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
21ac0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
21ad0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
21ae0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
21af0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
21b00 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
21b10 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
21b20 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
21b30 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
21b40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21b50 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
21b60 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
21b70 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
21b80 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
21b90 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
21ba0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
21bb0 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
21bc0 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74         c = sqlit
21bd0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
21be0 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
21bf0 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64  *)&pCell[2], pId
21c00 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
21c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21c20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c  /* The record fl
21c30 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e  ows over onto on
21c40 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
21c50 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20  ow pages. In.   
21c60 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
21c70 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65  ase the whole ce
21c80 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ll needs to be p
21c90 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20  arsed, a buffer 
21ca0 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20  allocated.      
21cb0 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73      ** and acces
21cc0 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20  sPayload() used 
21cd0 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20  to retrieve the 
21ce0 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a  record into the.
21cf0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66            ** buf
21d00 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52  fer before VdbeR
21d10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
21d20 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 2a 2f  an be called. */
21d30 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69 64 20  .          void 
21d40 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20  *pCellKey;.     
21d50 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20       u8 * const 
21d60 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c  pCellBody = pCel
21d70 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l - pPage->child
21d80 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
21d90 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
21da0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
21db0 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70  e, pCellBody, &p
21dc0 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
21dd0 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69        nCell = (i
21de0 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  nt)pCur->info.nK
21df0 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  ey;.          pC
21e00 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
21e10 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20 29 3b  Malloc( nCell );
21e20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
21e30 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
21e40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
21e50 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
21e60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
21e70 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
21e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21e90 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
21ea0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
21eb0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
21ec0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
21ed0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
21ee0 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65   c = sqlite3Vdbe
21ef0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
21f00 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
21f10 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
21f20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21f30 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
21f40 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
21f50 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
21f60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21f70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
21f80 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
21f90 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
21fa0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  && !pPage->leaf 
21fb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
21fc0 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20   = idx;.        
21fd0 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b    upr = lwr - 1;
21fe0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
21ff0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22000 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
22010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
22020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
22030 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
22040 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
22050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22060 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
22070 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69  .        lwr = i
22080 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  dx+1;.      }els
22090 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d  e{.        upr =
220a0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a   idx-1;.      }.
220b0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
220c0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  r ){.        bre
220d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
220e0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
220f0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
22100 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32 29 3b  6)((lwr+upr)/2);
22110 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22120 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b  t( lwr==upr+1 );
22130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
22140 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
22150 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
22160 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  f ){.      chldP
22170 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  g = 0;.    }else
22180 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
22190 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
221a0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
221b0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
221c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
221d0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
221e0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
221f0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
22200 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
22210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
22220 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ldPg==0 ){.     
22230 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
22240 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
22250 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ]<pCur->apPage[p
22260 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
22270 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ll );.      if( 
22280 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 63  pRes ) *pRes = c
22290 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
222a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f  ITE_OK;.      go
222b0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
222c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
222d0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
222e0 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
222f0 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
22300 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
22310 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
22320 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76   0;.    rc = mov
22330 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 63  eToChild(pCur, c
22340 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28 20  hldPg);.    if( 
22350 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f  rc ) goto moveto
22360 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76  _finish;.  }.mov
22370 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 72 65  eto_finish:.  re
22380 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22390 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
223a0 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f  n of BtreeMoveto
223b0 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b  , pKey is a pack
223c0 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a  ed index record.
223d0 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65  ** such as is ge
223e0 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f  nerated by the O
223f0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
22400 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65  ode.  Unpack the
22410 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74  .** record and t
22420 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f  hen call BtreeMo
22430 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74  vetoUnpacked() t
22440 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a  o do the work..*
22450 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22460 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75  eeMoveto(.  BtCu
22470 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
22480 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f  /* Cursor open o
22490 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62  n the btree to b
224a0 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20  e searched */.  
224b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
224c0 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65  ,   /* Packed ke
224d0 79 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69  y if the btree i
224e0 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  s an index */.  
224f0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  i64 nKey,       
22500 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b      /* Integer k
22510 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20  ey for tables.  
22520 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72  Size of pKey for
22530 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e   indices */.  in
22540 74 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20  t bias,         
22550 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68    /* Bias search
22560 20 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64   to the high end
22570 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20   */.  int *pRes 
22580 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
22590 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
225a0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
225b0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
225c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
225d0 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e  tus code */.  Un
225e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
225f0 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61  dxKey;   /* Unpa
22600 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
22610 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b  /.  char aSpace[
22620 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  150];          /
22630 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72  * Temp space for
22640 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76   pIdxKey - to av
22650 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a  oid a malloc */.
22660 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
22670 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
22680 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
22690 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
226a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
226b0 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
226c0 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
226d0 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20  Key, pKey,.     
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22700 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28   aSpace, sizeof(
22710 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66  aSpace));.    if
22720 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72  ( pIdxKey==0 ) r
22730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
22740 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  EM;.  }else{.   
22750 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a 20 20   pIdxKey = 0;.  
22760 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
22770 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
22780 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78 4b 65  ked(pCur, pIdxKe
22790 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c 20 70  y, nKey, bias, p
227a0 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b 65 79  Res);.  if( pKey
227b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
227c0 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65  dbeDeleteUnpacke
227d0 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65 79 29  dRecord(pIdxKey)
227e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
227f0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
22800 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
22810 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
22820 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
22830 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
22840 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
22850 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
22860 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
22870 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
22880 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
22890 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
228a0 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
228b0 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
228c0 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
228d0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
228e0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
228f0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
22900 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
22910 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22920 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
22930 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
22940 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
22950 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
22960 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
22970 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
22980 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
22990 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
229a0 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
229b0 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
229c0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
229d0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
229e0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
229f0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
22a00 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
22a10 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
22a20 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
22a30 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
22a40 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
22a50 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
22a60 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
22a70 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
22a80 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
22a90 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
22aa0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
22ab0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
22ac0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
22ad0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
22ae0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
22af0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
22b00 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  es=1..*/.int sql
22b10 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
22b20 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
22b30 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
22b40 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  rc;.  int idx;. 
22b50 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
22b60 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
22b70 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
22b80 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
22b90 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
22ba0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
22bb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22bd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 52    }.  assert( pR
22be0 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 43  es!=0 );.  if( C
22bf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
22c00 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
22c10 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
22c20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22c30 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
22c40 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
22c50 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
22c60 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
22c70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
22c80 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
22c90 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
22ca0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
22cb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
22cc0 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  ];.  idx = ++pCu
22cd0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22ce0 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28  Page];.  assert(
22cf0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
22d00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c  ;.  assert( idx<
22d10 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
22d20 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
22d30 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
22d40 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
22d50 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
22d60 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
22d70 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
22d80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
22d90 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
22da0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
22db0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
22dc0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
22dd0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
22de0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
22df0 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  c = moveToLeftmo
22e00 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
22e10 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
22e20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22e30 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
22e40 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
22e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
22e60 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
22e70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
22e80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
22e90 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
22ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
22eb0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
22ec0 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
22ed0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
22ee0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
22ef0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
22f00 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75  .    }while( pCu
22f10 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
22f20 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43  Page]>=pPage->nC
22f30 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ell );.    *pRes
22f40 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
22f50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
22f60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22f70 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
22f80 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
22f90 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
22fa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
22fb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22fc0 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  }.  *pRes = 0;. 
22fd0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
22fe0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
22ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
23000 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
23010 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72 65 74  ost(pCur);.  ret
23020 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
23030 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
23040 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
23050 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
23060 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
23070 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
23080 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
23090 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
230a0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
230b0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
230c0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
230d0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
230e0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
230f0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
23100 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
23110 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
23120 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
23130 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
23140 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
23150 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
23160 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
23170 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
23180 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
23190 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
231a0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
231b0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ur);.  if( rc!=S
231c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
231d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
231e0 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20   pCur->atLast = 
231f0 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f  0;.  if( CURSOR_
23200 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
23210 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52  State ){.    *pR
23220 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  es = 1;.    retu
23230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23240 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b  }.  if( pCur->sk
23250 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75 72  ip<0 ){.    pCur
23260 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20  ->skip = 0;.    
23270 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72  *pRes = 0;.    r
23280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23290 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69  .  }.  pCur->ski
232a0 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65 20  p = 0;..  pPage 
232b0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
232c0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
232d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
232e0 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70  Init );.  if( !p
232f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
23300 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72    int idx = pCur
23310 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
23320 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d  age];.    rc = m
23330 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
23340 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
23350 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29  ll(pPage, idx)))
23360 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
23370 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
23380 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
23390 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
233a0 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pCur);.  }else{.
233b0 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d      while( pCur-
233c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
233d0 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ge]==0 ){.      
233e0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
233f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
23400 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
23410 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
23420 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
23430 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
23440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
23450 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
23460 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
23470 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
23480 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
23490 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
234a0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
234b0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
234c0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
234d0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
234e0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
234f0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
23500 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
23510 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
23520 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23530 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
23540 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
23550 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23560 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
23570 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
23580 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
23590 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
235a0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
235b0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
235c0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
235d0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
235e0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
235f0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
23600 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
23610 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
23620 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
23630 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
23640 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
23650 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
23660 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
23670 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
23680 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
23690 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
236a0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
236b0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
236c0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
236d0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
236e0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
236f0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
23700 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
23710 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
23720 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
23730 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
23740 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
23750 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
23760 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
23770 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
23780 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
23790 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
237a0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
237b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
237c0 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
237d0 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
237e0 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
237f0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
23800 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
23810 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
23820 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
23830 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
23840 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
23850 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
23860 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
23870 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
23880 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
23890 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
238a0 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
238b0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
238c0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
238d0 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
238e0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
238f0 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
23900 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
23910 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
23920 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
23930 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
23940 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
23950 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
23960 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
23970 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
23980 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
23990 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
239a0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
239b0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
239c0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
239d0 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
239e0 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
239f0 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
23a00 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
23a10 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
23a20 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
23a30 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20  nt rc;.  u32 n; 
23a40 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23a50 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
23a60 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32 20  eelist */.  u32 
23a70 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
23a80 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
23a90 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
23aa0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
23ab0 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
23ac0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
23ad0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50  evTrunk = 0;.  P
23ae0 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20 20  gno mxPage;     
23af0 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66  /* Total size of
23b00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23b10 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
23b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23b30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
23b40 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
23b50 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
23b60 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
23b70 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e 20 3d  ount(pBt);.  n =
23b80 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
23b90 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
23ba0 20 69 66 28 20 6e 3e 6d 78 50 61 67 65 20 29 7b   if( n>mxPage ){
23bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23bc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
23bd0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
23be0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
23bf0 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
23c00 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
23c10 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
23c20 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
23c30 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
23c40 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
23c50 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
23c60 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
23c70 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
23c80 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a  ' */.    .    /*
23c90 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27 20   If the 'exact' 
23ca0 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74 72  parameter was tr
23cb0 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20 6f  ue and a query o
23cc0 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  f the pointer-ma
23cd0 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20 74  p.    ** shows t
23ce0 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e 65  hat the page 'ne
23cf0 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68 65  arby' is somewhe
23d00 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
23d10 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  ist, then.    **
23d20 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73 74   the entire-list
23d30 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68 65   will be searche
23d40 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 2e  d for that page.
23d50 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  .    */.#ifndef 
23d60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23d70 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 65  VACUUM.    if( e
23d80 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c 3d  xact && nearby<=
23d90 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  mxPage ){.      
23da0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
23db0 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
23dc0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
23dd0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
23de0 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
23df0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
23e00 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
23e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
23e20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
23e30 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
23e40 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
23e50 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
23e60 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
23e70 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
23e80 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
23e90 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
23ea0 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
23eb0 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
23ec0 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
23ed0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
23ee0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
23ef0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
23f00 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
23f10 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
23f20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
23f30 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23f40 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
23f50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
23f60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
23f70 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
23f80 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
23f90 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
23fa0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
23fb0 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
23fc0 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
23fd0 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
23fe0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
23ff0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
24000 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
24010 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
24020 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
24030 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
24040 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
24050 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
24060 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
24070 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
24080 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
24090 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
240a0 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
240b0 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
240c0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
240d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
240e0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
240f0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
24100 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
24110 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24120 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b  iTrunk>mxPage ){
24130 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24140 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24150 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
24160 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24170 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
24180 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
24190 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
241a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20   }.      if( rc 
241b0 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e  ){.        pTrun
241c0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67  k = 0;.        g
241d0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
241e0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  _page;.      }..
241f0 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
24200 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
24210 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
24220 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
24230 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
24240 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
24250 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
24260 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
24270 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
24280 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
24290 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
242a0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
242b0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
242c0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
242d0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
242e0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
242f0 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
24300 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
24310 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24320 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
24330 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
24340 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
24350 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
24360 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
24370 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
24380 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
24390 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
243a0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
243b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
243c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
243d0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
243e0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
243f0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
24400 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
24410 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
24420 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
24430 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
24440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
24450 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
24460 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
24470 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
24480 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
24490 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
244a0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
244b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
244c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
244d0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
244e0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
244f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24500 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
24510 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24520 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
24530 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
24540 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
24550 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
24560 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
24570 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
24580 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
24590 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
245a0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
245b0 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
245c0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
245d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
245e0 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
245f0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
24600 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
24610 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
24620 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
24630 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24640 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
24650 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
24660 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
24670 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
24680 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
24690 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
246a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
246b0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
246c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
246d0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
246e0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
246f0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
24700 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
24710 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
24720 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
24730 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
24740 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
24750 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
24780 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
24790 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
247a0 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
247b0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
247c0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
247d0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
247e0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
247f0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
24800 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
24810 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
24820 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
24830 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
24840 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
24850 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
24860 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
24870 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
24880 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
24890 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
248a0 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
248b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
248c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
248d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
248e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
248f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24900 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24910 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
24920 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
24930 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
24940 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
24950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24960 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
24970 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
24980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24990 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
249a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
249b0 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
249c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
249d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
249e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
249f0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
24a00 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
24a10 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
24a20 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
24a30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
24a40 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
24a50 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
24a60 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
24a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
24a80 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
24a90 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
24aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
24ab0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
24ac0 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
24ad0 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
24ae0 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
24af0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
24b00 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
24b10 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
24b20 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
24b30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24b40 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24b50 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
24b60 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
24b70 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
24b80 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
24b90 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
24ba0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
24bb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24bc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24bd0 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
24be0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
24bf0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24c00 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
24c10 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
24c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24c30 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
24c40 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
24c50 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
24c60 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
24c70 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
24c80 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
24c90 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
24ca0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
24cb0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
24cc0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
24cd0 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
24ce0 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
24cf0 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
24d00 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
24d10 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
24d20 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
24d30 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
24d40 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
24d50 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
24d60 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
24d70 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
24d80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24d90 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
24da0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
24db0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24dc0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24dd0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24de0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24df0 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30      if( nearby>0
24e00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33   ){.          u3
24e10 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  2 i;.          i
24e20 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20  nt dist;.       
24e30 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a     closest = 0;.
24e40 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
24e50 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
24e60 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  [8]) - nearby;. 
24e70 20 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73           if( dis
24e80 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69  t<0 ) dist = -di
24e90 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
24ea0 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29  r(i=1; i<k; i++)
24eb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
24ec0 74 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28  t d2 = get4byte(
24ed0 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d  &aData[8+i*4]) -
24ee0 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
24ef0 20 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20       if( d2<0 ) 
24f00 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20  d2 = -d2;.      
24f10 20 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73        if( d2<dis
24f20 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
24f30 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a     closest = i;.
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
24f50 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
24f60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24f70 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
24f80 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
24f90 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
24fa0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
24fb0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
24fc0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
24fd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
24fe0 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20  Page>mxPage ){. 
24ff0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25000 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25010 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
25020 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
25030 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
25040 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
25050 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d  chList || iPage=
25060 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
25070 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65       int noConte
25080 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nt;.          Pg
25090 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  no nPage;.      
250a0 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
250b0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50  ge;.          nP
250c0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
250d0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 20  ount(pBt);.     
250e0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3e 6e       if( iPage>n
250f0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
25100 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67 65      /* Free page
25110 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
25120 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
25130 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25140 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25150 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
25160 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
25170 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
25180 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43  }.          TRAC
25190 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
251a0 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20   was leaf %d of 
251b0 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a  %d on trunk %d".
251c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251d0 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65   ": %d more free
251e0 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20   pages\n",.     
251f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67              *pPg
25200 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b  no, closest+1, k
25210 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20  , pTrunk->pgno, 
25220 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  n-1));.         
25230 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31   if( closest<k-1
25240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25250 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b  memcpy(&aData[8+
25260 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61  closest*4], &aDa
25270 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20  ta[4+k*4], 4);. 
25280 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25290 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61       put4byte(&a
252a0 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
252b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
252c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
252d0 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e 6b 2d  riteable(pTrunk-
252e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
252f0 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74         noContent
25300 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43   = !btreeGetHasC
25310 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67  ontent(pBt, *pPg
25320 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
25330 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25340 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
25350 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
25360 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
25370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25390 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
253a0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
253b0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
253c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
253d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
253e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
253f0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
25400 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
25410 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
25420 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c           searchL
25430 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
25440 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
25450 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
25460 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  evTrunk);.      
25470 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
25480 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72      }while( sear
25490 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73  chList );.  }els
254a0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  e{.    /* There 
254b0 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20  are no pages on 
254c0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f  the freelist, so
254d0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
254e0 67 65 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a  ge at the.    **
254f0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
25500 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
25510 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
25520 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 50  nt(pBt);.    *pP
25530 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b  gno = nPage + 1;
25540 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f  ..    if( *pPgno
25550 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
25560 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
25570 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
25580 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
25590 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
255a0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
255b0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
255c0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
255d0 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
255e0 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
255f0 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
25600 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
25610 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
25620 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
25630 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
25640 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
25650 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
25660 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
25670 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
25680 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
25690 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
256a0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
256b0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
256c0 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
256d0 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  *pPg = 0;.      
256e0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
256f0 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
25700 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
25710 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
25720 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
25730 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
25740 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
25750 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
25760 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
25770 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
25780 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20 20 20  o, &pPg, 0);.   
25790 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
257a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
257b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
257c0 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
257d0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
257e0 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
257f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25800 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
25810 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29  ;.      (*pPgno)
25820 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a 70  ++;.      if( *p
25830 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno==PENDING_BY
25840 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
25850 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20  (*pPgno)++; }.  
25860 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
25870 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
25880 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
25890 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
258a0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
258b0 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67  etPage(pBt, *pPg
258c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a  no, ppPage, 0);.
258d0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
258e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
258f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
25900 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
25910 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
25920 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
25930 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
25940 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
25950 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
25960 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
25970 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
25980 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
25990 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
259a0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
259b0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
259c0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
259d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
259e0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
259f0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
25a00 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
25a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
25a20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
25a30 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
25a40 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20  ge)->pDbPage)>1 
25a50 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
25a60 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
25a70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25a80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
25a90 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
25aa0 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
25ab0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
25ac0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
25ad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25ae0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25af0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61  ion is used to a
25b00 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f  dd page iPage to
25b10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25b20 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a  le free-list. .*
25b30 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  * It is assumed 
25b40 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
25b50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70   not already a p
25b60 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d  art of the free-
25b70 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  list..**.** The 
25b80 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
25b90 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
25ba0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
25bb0 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c  tion is optional
25bc0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c  ..** If the call
25bd0 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61  er happens to ha
25be0 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ve a pointer to 
25bf0 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65  the MemPage obje
25c00 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ct .** correspon
25c10 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61  ding to page iPa
25c20 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79  ge handy, it may
25c30 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20   pass it as the 
25c40 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a  second value. .*
25c50 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  * Otherwise, it 
25c60 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a  may pass NULL..*
25c70 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65  *.** If a pointe
25c80 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f  r to a MemPage o
25c90 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20  bject is passed 
25ca0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
25cb0 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72  gument,.** its r
25cc0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
25cd0 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79  s not altered by
25ce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
25cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72  */.static int fr
25d00 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64  eePage2(BtShared
25d10 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a   *pBt, MemPage *
25d20 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69  pMemPage, Pgno i
25d30 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65  Page){.  MemPage
25d40 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20   *pTrunk = 0;   
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d60 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  Free-list trunk 
25d70 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  page */.  Pgno i
25d80 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20  Trunk = 0;      
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25da0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   Page number of 
25db0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
25dc0 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61  page */ .  MemPa
25dd0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
25de0 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f  ->pPage1;      /
25df0 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63  * Local referenc
25e00 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
25e10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69       /* Page bei
25e40 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65  ng freed. May be
25e50 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20   NULL. */.  int 
25e60 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
25e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e80 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
25e90 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
25ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25eb0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
25ec0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
25ed0 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20  es on free-list 
25ee0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
25ef0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
25f00 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
25f10 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 3e    assert( iPage>
25f20 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
25f30 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d  pMemPage || pMem
25f40 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67  Page->pgno==iPag
25f50 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d  e );..  if( pMem
25f60 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
25f70 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
25f80 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
25f90 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
25fa0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25fb0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
25fc0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
25fd0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
25fe0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
25ff0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
26000 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
26010 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
26020 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
26030 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
26040 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26050 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
26060 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
26070 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
26080 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
26090 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
260a0 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  1);..#ifdef SQLI
260b0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
260c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c  .  /* If the SQL
260d0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
260e0 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  E compile-time o
260f0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
26100 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61  , then.  ** alwa
26110 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
26120 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
26130 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
26140 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21  s..  */.  if( (!
26150 70 50 61 67 65 20 26 26 20 28 72 63 20 3d 20 73  pPage && (rc = s
26160 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
26170 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
26180 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c  pPage, 0))).   |
26190 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 72 63  |            (rc
261a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
261b0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
261c0 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  age)).  ){.    g
261d0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
261e0 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
261f0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
26200 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
26210 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Size);.#endif.. 
26220 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
26230 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
26240 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20  o-vacuum, write 
26250 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
26260 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a  pointer-map.  **
26270 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
26280 74 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72  t the page is fr
26290 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49  ee..  */.  if( I
262a0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
262b0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
262c0 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54  t(pBt, iPage, PT
262d0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
262e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
262f0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
26300 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  t;.  }..  /* Now
26310 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20   manipulate the 
26320 61 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20  actual database 
26330 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74  free-list struct
26340 75 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74  ure. There are t
26350 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c  wo.  ** possibil
26360 69 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72  ities. If the fr
26370 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65  ee-list is curre
26380 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69  ntly empty, or i
26390 66 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  f the first.  **
263a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
263b0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
263c0 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20  full, then this 
263d0 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65  page will become
263e0 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65   a.  ** new free
263f0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
26400 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
26410 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65  will become a le
26420 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  af of the.  ** f
26430 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  irst trunk page 
26440 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
26450 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62  ree-list. This b
26460 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74  lock tests if it
26470 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
26480 65 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67  e to add the pag
26490 65 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d  e as a new free-
264a0 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a  list leaf..  */.
264b0 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29    if( nFree!=0 )
264c0 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b  {.    int nLeaf;
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65  /* Initial numbe
264f0 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20  r of leaf cells 
26500 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f  on trunk page */
26510 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67  ..    iTrunk = g
26520 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
26530 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
26540 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
26550 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
26560 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
26570 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
26580 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26590 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
265a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
265b0 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
265c0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
265d0 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c  [4]);.    if( nL
265e0 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  eaf<0 ){.      r
265f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
26600 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
26610 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
26620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26630 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c  nLeaf<pBt->usabl
26640 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
26650 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20       /* In this 
26660 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72 6f  case there is ro
26670 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20  om on the trunk 
26680 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74  page to insert t
26690 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  he page.      **
266a0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
266b0 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20  a new leaf..    
266c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f    **.      ** No
266d0 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75 6e  te that the trun
266e0 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65  k page is not re
266f0 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20  ally full until 
26700 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  it contains.    
26710 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
26720 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e  4 - 2 entries, n
26730 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ot usableSize/4 
26740 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20 77  - 8 entries as w
26750 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20  e have.      ** 
26760 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65 20  coded.  But due 
26770 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f  to a coding erro
26780 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66  r in versions of
26790 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f   SQLite prior to
267a0 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c  .      ** 3.6.0,
267b0 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 20   databases with 
267c0 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
267d0 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72  ages holding mor
267e0 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20  e than.      ** 
267f0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
26800 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65   entries will be
26810 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72   reported as cor
26820 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a  rupt.  In order.
26830 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e        ** to main
26840 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63  tain backwards c
26850 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
26860 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  h older versions
26870 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20   of SQLite,.    
26880 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e    ** we will con
26890 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74  tain to restrict
268a0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
268b0 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65  ntries to usable
268c0 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20  Size/4 - 8.     
268d0 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74   ** for now.  At
268e0 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
268f0 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20  he future (once 
26900 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67  everyone has upg
26910 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  raded.      ** t
26920 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72  o 3.6.0 or later
26930 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73  ) we should cons
26940 69 64 65 72 20 66 69 78 69 6e 67 20 74 68 65 20  ider fixing the 
26950 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
26960 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65  e.      ** to re
26970 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  ad "usableSize/4
26980 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  -2" instead of "
26990 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e  usableSize/4-8".
269a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
269b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
269c0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
269d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
269e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
269f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
26a00 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
26a10 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
26a20 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
26a30 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
26a40 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
26a50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  age);.#ifndef SQ
26a60 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
26a70 54 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  TE.        if( p
26a80 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
26a90 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
26aa0 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
26ab0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
26ac0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
26ad0 20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48    rc = btreeSetH
26ae0 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69  asContent(pBt, i
26af0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
26b00 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45       TRACE(("FRE
26b10 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20  E-PAGE: %d leaf 
26b20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64  on trunk page %d
26b30 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  \n",pPage->pgno,
26b40 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a  pTrunk->pgno));.
26b50 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70        goto freep
26b60 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  age_out;.    }. 
26b70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74   }..  /* If cont
26b80 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69  rol flows to thi
26b90 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74  s point, then it
26ba0 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c   was not possibl
26bb0 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a  e to add the.  *
26bc0 2a 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  * the page being
26bd0 20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66   freed as a leaf
26be0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72   page of the fir
26bf0 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
26c00 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20  free-list..  ** 
26c10 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  Possibly because
26c20 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
26c30 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73  s empty, or poss
26c40 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
26c50 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75   .  ** first tru
26c60 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  nk in the free-l
26c70 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74  ist is full. Eit
26c80 68 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67  her way, the pag
26c90 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20  e being freed.  
26ca0 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ** will become t
26cb0 68 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75  he new first tru
26cc0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
26cd0 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  ree-list..  */. 
26ce0 20 69 66 28 20 20 20 28 28 21 70 50 61 67 65 29   if(   ((!pPage)
26cf0 20 26 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20   && (0 != (rc = 
26d00 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
26d10 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20  age(pBt, iPage, 
26d20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20  &pPage, 0)))).  
26d30 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20     || (0 != (rc 
26d40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
26d50 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
26d60 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67  ge))).  ){.    g
26d70 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
26d80 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65  ;.  }.  put4byte
26d90 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69  (pPage->aData, i
26da0 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79  Trunk);.  put4by
26db0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
26dc0 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62  [4], 0);.  put4b
26dd0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
26de0 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a  ta[32], iPage);.
26df0 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
26e00 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e  AGE: %d new trun
26e10 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67  k page replacing
26e20 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
26e30 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a  gno, iTrunk));..
26e40 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  freepage_out:.  
26e50 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
26e60 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
26e70 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73   0;.  }.  releas
26e80 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
26e90 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
26ea0 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  nk);.  return rc
26eb0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
26ec0 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
26ed0 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72  *pPage){.  retur
26ee0 6e 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  n freePage2(pPag
26ef0 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
26f00 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a  Page->pgno);.}..
26f10 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
26f20 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
26f30 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
26f40 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
26f50 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
26f60 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
26f70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
26f80 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
26f90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
26fa0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
26fb0 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
26fc0 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
26fd0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
26fe0 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61  fl;.  u16 ovflPa
26ff0 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
27000 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
27010 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
27020 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
27030 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
27040 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
27050 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
27060 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
27070 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
27080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
27090 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
270a0 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
270b0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
270c0 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
270d0 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
270e0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
270f0 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72  rflow]);.  asser
27100 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
27110 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
27120 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
27130 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
27140 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e    nOvfl = (info.
27150 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e  nPayload - info.
27160 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
27170 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
27180 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
27190 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  t( ovflPgno==0 |
271a0 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77  | nOvfl>0 );.  w
271b0 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b  hile( nOvfl-- ){
271c0 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20  .    Pgno iNext 
271d0 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  = 0;.    MemPage
271e0 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20   *pOvfl = 0;.   
271f0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20   if( ovflPgno<2 
27200 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65  || ovflPgno>page
27210 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  rPagecount(pBt) 
27220 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73  ){.      /* 0 is
27230 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67   not a legal pag
27240 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67  e number and pag
27250 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e  e 1 cannot be an
27260 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66   .      ** overf
27270 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72 65 66  low page. Theref
27280 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c  ore if ovflPgno<
27290 32 20 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e  2 or past the en
272a0 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20  d of the .      
272b0 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61 74 61  ** file the data
272c0 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
272d0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rupt. */.      r
272e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
272f0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
27300 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29  .    if( nOvfl )
27310 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65 74  {.      rc = get
27320 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74  OverflowPage(pBt
27330 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76  , ovflPgno, &pOv
27340 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20  fl, &iNext);.   
27350 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
27360 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
27370 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
27380 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
27390 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 70  Pgno);.    if( p
273a0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  Ovfl ){.      sq
273b0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
273c0 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b  pOvfl->pDbPage);
273d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
273e0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
273f0 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 69 4e     ovflPgno = iN
27400 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
27410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
27420 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65  /*.** Create the
27430 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 75   byte sequence u
27440 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
27450 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20   a cell on page 
27460 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72 69  pPage.** and wri
27470 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65 71  te that byte seq
27480 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c 6c  uence into pCell
27490 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70 61  [].  Overflow pa
274a0 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63  ges are.** alloc
274b0 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64 20  ated and filled 
274c0 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  in as necessary.
274d0 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70 72    The calling pr
274e0 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72 65  ocedure.** is re
274f0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
27500 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69 63  king sure suffic
27510 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20 62  ient space has b
27520 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  een allocated.**
27530 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a   for pCell[]..**
27540 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70 43  .** Note that pC
27550 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65 63  ell does not nec
27560 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20 70  essary need to p
27570 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61 67  oint to the pPag
27580 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65 61  e->aData.** area
27590 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 70  .  pCell might p
275a0 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65 6d  oint to some tem
275b0 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e 20  porary storage. 
275c0 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a   The cell will.*
275d0 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65 64  * be constructed
275e0 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72 61   in this tempora
275f0 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f 70  ry area then cop
27600 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e  ied into pPage->
27610 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a  aData.** later..
27620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
27630 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  llInCell(.  MemP
27640 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
27650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
27660 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
27670 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ains the cell */
27680 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27690 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
276a0 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74 65    /* Complete te
276b0 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  xt of the cell *
276c0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
276d0 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20  pKey, i64 nKey, 
276e0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f     /* The key */
276f0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
27700 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c 20  Data,int nData, 
27710 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
27720 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20  .  int nZero,   
27730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27740 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f 20    /* Extra zero 
27750 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
27760 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e  to pData */.  in
27770 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20  t *pnSize       
27780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27790 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20  Write cell size 
277a0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
277b0 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e   nPayload;.  con
277c0 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69  st u8 *pSrc;.  i
277d0 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b 0a  nt nSrc, n, rc;.
277e0 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b    int spaceLeft;
277f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66  .  MemPage *pOvf
27800 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  l = 0;.  MemPage
27810 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30   *pToRelease = 0
27820 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
27830 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e 73  r *pPrior;.  uns
27840 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61 79  igned char *pPay
27850 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65 64  load;.  BtShared
27860 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
27870 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f  Bt;.  Pgno pgnoO
27880 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  vfl = 0;.  int n
27890 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49 6e  Header;.  CellIn
278a0 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73 65  fo info;..  asse
278b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
278c0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
278d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
278e0 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  /* pPage is not 
278f0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72 69 74  necessarily writ
27900 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43 65 6c  eable since pCel
27910 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78 69 6c  l might be auxil
27920 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66 65 72  iary.  ** buffer
27930 20 73 70 61 63 65 20 74 68 61 74 20 69 73 20 73   space that is s
27940 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68 65  eparate from the
27950 20 70 50 61 67 65 20 62 75 66 66 65 72 20 61 72   pPage buffer ar
27960 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ea */.  assert( 
27970 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61 44 61  pCell<pPage->aDa
27980 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26 70 50  ta || pCell>=&pP
27990 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
279a0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
279b0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
279c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
279d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
279e0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
279f0 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
27a00 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
27a10 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
27a20 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
27a30 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
27a40 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
27a50 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
27a60 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
27a70 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
27a80 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
27a90 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
27aa0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
27ab0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
27ac0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
27ad0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
27ae0 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
27af0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
27b00 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
27b10 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
27b20 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
27b30 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
27b40 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
27b50 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
27b60 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 28 75  ( info.nData==(u
27b70 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72 6f 29  32)(nData+nZero)
27b80 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c   );.  .  /* Fill
27b90 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
27ba0 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  */.  nPayload = 
27bb0 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20  nData + nZero;. 
27bc0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
27bd0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
27be0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
27bf0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
27c00 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
27c10 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65 79 3e  { .    if( nKey>
27c20 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20 70 4b  0x7fffffff || pK
27c30 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ey==0 ){.      r
27c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
27c50 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
27c60 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69 6e 74  nPayload += (int
27c70 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
27c80 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
27c90 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
27ca0 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e  }.  *pnSize = in
27cb0 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63  fo.nSize;.  spac
27cc0 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f  eLeft = info.nLo
27cd0 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20  cal;.  pPayload 
27ce0 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  = &pCell[nHeader
27cf0 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70  ];.  pPrior = &p
27d00 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
27d10 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  low];..  while( 
27d20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20  nPayload>0 ){.  
27d30 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d    if( spaceLeft=
27d40 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
27d50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
27d60 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
27d70 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
27d80 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
27d90 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
27da0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
27db0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
27dc0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
27dd0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
27de0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
27df0 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
27e00 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
27e10 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
27e20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
27e30 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
27e40 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
27e50 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
27e60 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
27e70 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
27e80 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
27e90 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
27ea0 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e  noOvfl, 0);.#ifn
27eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27ec0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
27ed0 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
27ee0 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74  ase supports aut
27ef0 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68  o-vacuum, and th
27f00 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73  e second or subs
27f10 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  equent.      ** 
27f20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
27f30 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64   being allocated
27f40 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74  , add an entry t
27f50 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
27f60 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74  p.      ** for t
27f70 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20  hat page now. . 
27f80 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
27f90 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
27fa0 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
27fb0 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20  age, then write 
27fc0 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20  a partial entry 
27fd0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65  .      ** to the
27fe0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66   pointer-map. If
27ff0 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e   we write nothin
28000 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65  g to this pointe
28010 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20  r-map slot,.    
28020 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70    ** then the op
28030 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f  timistic overflo
28040 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69  w chain processi
28050 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28  ng in clearCell(
28060 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d  ).      ** may m
28070 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20  isinterpret the 
28080 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61  uninitialised va
28090 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20  lues and delete 
280a0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f  the.      ** wro
280b0 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68  ng pages from th
280c0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
280d0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
280e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
280f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
28100 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54  ){.        u8 eT
28110 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61  ype = (pgnoPtrma
28120 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  p?PTRMAP_OVERFLO
28130 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  W2:PTRMAP_OVERFL
28140 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63  OW1);.        rc
28150 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
28160 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
28170 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a  e, pgnoPtrmap);.
28180 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
28190 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
281a0 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  asePage(pOvfl);.
281b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
281c0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
281d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
281e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
281f0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
28200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28210 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
28220 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  f pToRelease is 
28230 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50  not zero than pP
28240 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f  rior points into
28250 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20   the data area. 
28260 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65       ** of pToRe
28270 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72  lease.  Make sur
28280 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20  e pToRelease is 
28290 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e  still writeable.
282a0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
282b0 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20  ( pToRelease==0 
282c0 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
282d0 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65  swriteable(pToRe
282e0 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20  lease->pDbPage) 
282f0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
28300 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f  pPrior is part o
28310 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20  f the data area 
28320 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d  of pPage, then m
28330 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20  ake sure pPage. 
28340 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c       ** is still
28350 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20   writeable */.  
28360 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69      assert( pPri
28370 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20  or<pPage->aData 
28380 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67  || pPrior>=&pPag
28390 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61  e->aData[pBt->pa
283a0 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
283b0 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
283c0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
283d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
283e0 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ;..      put4byt
283f0 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76  e(pPrior, pgnoOv
28400 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  fl);.      relea
28410 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
28420 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c  e);.      pToRel
28430 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20  ease = pOvfl;.  
28440 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76      pPrior = pOv
28450 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20  fl->aData;.     
28460 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
28470 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79  , 0);.      pPay
28480 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61  load = &pOvfl->a
28490 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73  Data[4];.      s
284a0 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e  paceLeft = pBt->
284b0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
284c0 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50      }.    n = nP
284d0 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
284e0 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
284f0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
28500 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
28510 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
28520 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
28530 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
28540 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
28550 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
28560 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
28570 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
28580 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
28590 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
285a0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
285b0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
285c0 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
285d0 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
285e0 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
285f0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
28600 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
28610 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
28620 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
28630 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
28640 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
28650 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
28660 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
28670 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
28680 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
28690 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
286a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
286b0 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
286c0 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
286d0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Src>0 ){.      i
286e0 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20  f( n>nSrc ) n = 
286f0 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65  nSrc;.      asse
28700 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20  rt( pSrc );.    
28710 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
28720 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
28730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65   }else{.      me
28740 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30  mset(pPayload, 0
28750 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , n);.    }.    
28760 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20  nPayload -= n;. 
28770 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     pPayload += n
28780 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b  ;.    pSrc += n;
28790 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a  .    nSrc -= n;.
287a0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d      spaceLeft -=
287b0 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63   n;.    if( nSrc
287c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72  ==0 ){.      nSr
287d0 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20  c = nData;.     
287e0 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
287f0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61     }.  }.  relea
28800 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73  sePage(pToReleas
28810 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
28820 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
28830 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68   Remove the i-th
28840 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
28850 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
28860 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e  effects pPage on
28870 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ly..** The cell 
28880 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66  content is not f
28890 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61  reed or dealloca
288a0 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75  ted.  It is assu
288b0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
288c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  cell content has
288d0 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d   been copied som
288e0 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68  eplace else.  Th
288f0 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a  is routine just.
28900 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72  ** removes the r
28910 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
28920 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
28930 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74  .**.** "sz" must
28940 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
28950 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63  f bytes in the c
28960 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ell..*/.static i
28970 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  nt dropCell(MemP
28980 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
28990 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20  idx, int sz){.  
289a0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
289b0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
289c0 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
289d0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
289e0 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  o cell content o
289f0 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c  f cell being del
28a00 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61  eted */.  u8 *da
28a10 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ta;       /* pPa
28a20 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75  ge->aData */.  u
28a30 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f  8 *ptr;        /
28a40 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62  * Used to move b
28a50 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68  ytes around with
28a60 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69  in data[] */.  i
28a70 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f  nt rc;         /
28a80 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64  * The return cod
28a90 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
28aa0 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
28ab0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
28ac0 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
28ad0 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29  Size(pPage, idx)
28ae0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
28af0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
28b00 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
28b10 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
28b20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
28b30 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
28b40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61  ->mutex) );.  da
28b50 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
28b60 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61  a;.  ptr = &data
28b70 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73  [pPage->cellOffs
28b80 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70  et + 2*idx];.  p
28b90 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
28ba0 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70 50 61  );.  if( (pc<pPa
28bb0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b  ge->hdrOffset+6+
28bc0 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
28bd0 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63 2b 73  )).     || (pc+s
28be0 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  z>pPage->pBt->us
28bf0 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  ableSize) ){.   
28c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
28c10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
28c20 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
28c30 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
28c40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
28c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
28c60 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 66 6f  urn rc;.  }.  fo
28c70 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50 61  r(i=idx+1; i<pPa
28c80 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c 20  ge->nCell; i++, 
28c90 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74 72  ptr+=2){.    ptr
28ca0 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20 20  [0] = ptr[2];.  
28cb0 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 33    ptr[1] = ptr[3
28cc0 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  ];.  }.  pPage->
28cd0 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32 62  nCell--;.  put2b
28ce0 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d  yte(&data[pPage-
28cf0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20 70  >hdrOffset+3], p
28d00 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20  Page->nCell);.  
28d10 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
28d20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  2;.  return SQLI
28d30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28d40 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  Insert a new cel
28d50 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65  l on pPage at ce
28d60 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70  ll index "i".  p
28d70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  Cell points to t
28d80 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66  he.** content of
28d90 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a   the cell..**.**
28da0 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
28db0 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  tent will fit on
28dc0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
28dd0 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20 49  put it there.  I
28de0 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  f it.** will not
28df0 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20   fit, then make 
28e00 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65  a copy of the ce
28e10 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  ll content into 
28e20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d  pTemp if.** pTem
28e30 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20  p is not null.  
28e40 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54  Regardless of pT
28e50 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20  emp, allocate a 
28e60 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20  new entry.** in 
28e70 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20 61  pPage->aOvfl[] a
28e80 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74  nd make it point
28e90 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
28ea0 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20  tent (either.** 
28eb0 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20  in pTemp or the 
28ec0 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20  original pCell) 
28ed0 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20  and also record 
28ee0 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41  its index. .** A
28ef0 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
28f00 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e  entry in pPage->
28f10 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20  aCell[] implies 
28f20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e  that .** pPage->
28f30 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63  nOverflow is inc
28f40 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  remented..**.** 
28f50 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  If nSkip is non-
28f60 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  zero, then do no
28f70 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73 74  t copy the first
28f80 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20   nSkip bytes of 
28f90 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68 65  the.** cell. The
28fa0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76 65   caller will ove
28fb0 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74 65  rwrite them afte
28fc0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
28fd0 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20 6e  returns. If.** n
28fe0 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Skip is non-zero
28ff0 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61 79  , then pCell may
29000 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e   not point to an
29010 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79 20   invalid memory 
29020 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62 75  location .** (bu
29030 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69 73  t pCell+nSkip is
29040 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e 0a   always valid)..
29050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
29060 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
29070 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
29080 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
29090 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
290a0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
290b0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
290c0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
290d0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
290e0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
290f0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
29100 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
29110 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
29120 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
29130 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
29140 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
29150 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
29160 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
29170 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
29180 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
29190 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 20 20 20    Pgno iChild   
291a0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
291b0 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
291c0 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
291d0 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  his value */.){.
291e0 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
291f0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
29200 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
29210 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
29220 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
29230 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
29240 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
29250 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f   top;          /
29260 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
29270 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
29280 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a  cell in data[] *
29290 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
292a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
292b0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
292c0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
292d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
292e0 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
292f0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
29300 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
29310 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
29320 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68  erted */.  int h
29330 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
29340 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61  Offset into data
29350 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  [] of the page h
29360 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
29370 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
29380 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
29390 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
293a0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
293b0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
293c0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
293d0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
293e0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
293f0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
29400 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
29410 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
29420 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69 6e 74  data[] */..  int
29430 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69 6c 64   nSkip = (iChild
29440 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20 61 73   ? 4 : 0);..  as
29450 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
29460 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
29470 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
29480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
29490 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c  e->nCell<=MX_CEL
294a0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20 26 26  L(pPage->pBt) &&
294b0 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e   MX_CELL(pPage->
294c0 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a 20 20  pBt)<=5460 );.  
294d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
294e0 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53  Overflow<=ArrayS
294f0 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  ize(pPage->aOvfl
29500 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29510 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
29520 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
29530 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29540 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29550 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29560 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
29570 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
29580 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
29590 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
295a0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
295b0 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
295c0 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
295d0 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
295e0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
295f0 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
29600 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
29610 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
29620 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
29630 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
29640 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
29650 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
29660 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65  age->aOvfl)/size
29670 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b  of(pPage->aOvfl[
29680 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61 67  0])) );.    pPag
29690 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c  e->aOvfl[j].pCel
296a0 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70  l = pCell;.    p
296b0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69  Page->aOvfl[j].i
296c0 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20 20 7d  dx = (u16)i;.  }
296d0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
296e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
296f0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
29700 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
29710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29720 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29730 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29740 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
29750 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
29760 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
29770 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
29780 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20  Data;.    hdr = 
29790 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
297a0 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
297b0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
297c0 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73  ]);.    cellOffs
297d0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
297e0 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20  Offset;.    end 
297f0 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
29800 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20  *pPage->nCell + 
29810 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c  2;.    ins = cel
29820 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20  lOffset + 2*i;. 
29830 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70     if( end > top
29840 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72   - sz ){.      r
29850 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61  c = defragmentPa
29860 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
29870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
29880 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
29890 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
298a0 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74  .      top = get
298b0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
298c0 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  5]);.      asser
298d0 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74  t( end + sz <= t
298e0 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  op );.    }.    
298f0 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70  idx = allocateSp
29900 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a  ace(pPage, sz);.
29910 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3e      assert( idx>
29920 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
29930 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65   end <= get2byte
29940 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
29950 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73 7a  ;.    if (idx+sz
29960 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   > pPage->pBt->u
29970 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20 20  sableSize) {.   
29980 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29990 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
299a0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
299b0 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61  nCell++;.    pPa
299c0 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
299d0 65 2d 3e 6e 46 72 65 65 20 2d 20 28 75 31 36 29  e->nFree - (u16)
299e0 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65  (2 + sz);.    me
299f0 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b 6e  mcpy(&data[idx+n
29a00 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b  Skip], pCell+nSk
29a10 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20  ip, sz-nSkip);. 
29a20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
29a30 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
29a40 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43 68 69  &data[idx], iChi
29a50 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ld);.    }.    f
29a60 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
29a70 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
29a80 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
29a90 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
29aa0 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
29ab0 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
29ac0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
29ad0 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
29ae0 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
29af0 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
29b00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23  pPage->nCell);.#
29b10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
29b20 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
29b30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
29b40 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
29b50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
29b60 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20  l may contain a 
29b70 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76  pointer to an ov
29b80 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20  erflow page. If 
29b90 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20  so, write.      
29ba0 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ** the entry for
29bb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
29bc0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ge into the poin
29bd0 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a  ter map..      *
29be0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  /.      return p
29bf0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
29c00 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
29c10 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
29c20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29c30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
29c40 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
29c50 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
29c60 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
29c70 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
29c80 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
29c90 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
29ca0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
29cb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
29cc0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
29cd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
29ce0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
29cf0 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
29d00 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
29d10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
29d20 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
29d30 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
29d40 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
29d50 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
29d60 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
29d70 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
29d80 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
29d90 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
29da0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
29db0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
29dc0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
29dd0 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20 20 20  u8 *pCellptr;   
29de0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
29df0 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  next cell pointe
29e00 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62  r */.  int cellb
29e10 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64 72  ody;     /* Addr
29e20 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
29e30 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a 20   body */.  u8 * 
29e40 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
29e50 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
29e60 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
29e70 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
29e80 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
29e90 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
29ea0 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20  hdrOffset;      
29eb0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
29ec0 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 61 67  f header on pPag
29ed0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  e */.  const int
29ee0 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61 67 65   nUsable = pPage
29ef0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
29f00 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a  e; /* Usable siz
29f10 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a 20 20  e of page */..  
29f20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
29f30 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
29f40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
29f50 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
29f60 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
29f70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
29f80 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c 3d 4d  l>=0 && nCell<=M
29f90 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
29fa0 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
29fb0 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
29fc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
29fd0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
29fe0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
29ff0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  age) );..  /* Ch
2a000 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67  eck that the pag
2a010 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
2a020 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f 50 61  zeroed by zeroPa
2a030 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65 72 74  ge() */.  assert
2a040 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2a050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  0 );.  assert( g
2a060 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
2a070 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65 20 29  r+5])==nUsable )
2a080 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20 3d 20  ;..  pCellptr = 
2a090 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
2a0a0 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c 2a  lOffset + nCell*
2a0b0 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79 20 3d  2];.  cellbody =
2a0c0 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f 72 28   nUsable;.  for(
2a0d0 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d 30 3b  i=nCell-1; i>=0;
2a0e0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65 6c 6c   i--){.    pCell
2a0f0 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20 63 65  ptr -= 2;.    ce
2a100 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a 65 5b  llbody -= aSize[
2a110 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  i];.    put2byte
2a120 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c 6c 62  (pCellptr, cellb
2a130 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ody);.    memcpy
2a140 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
2a150 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
2a160 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 75  ze[i]);.  }.  pu
2a170 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2a180 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 70  +3], nCell);.  p
2a190 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
2a1a0 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b  r+5], cellbody);
2a1b0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
2a1c0 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20 6e 55  -= (nCell*2 + nU
2a1d0 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f 64 79  sable - cellbody
2a1e0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c  );.  pPage->nCel
2a1f0 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a  l = (u16)nCell;.
2a200 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
2a210 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
2a220 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
2a230 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
2a240 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
2a250 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
2a260 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
2a270 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
2a280 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2a290 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
2a2a0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
2a2b0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2a2c0 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
2a2d0 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
2a2e0 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
2a2f0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
2a300 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
2a310 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
2a320 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
2a330 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
2a340 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
2a350 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
2a360 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
2a370 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
2a380 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
2a390 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
2a3a0 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
2a3b0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
2a3c0 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
2a3d0 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
2a3e0 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
2a3f0 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
2a400 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
2a410 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
2a420 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
2a430 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
2a440 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
2a450 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
2a460 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
2a470 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
2a480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
2a490 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
2a4a0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
2a4b0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
2a4c0 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
2a4d0 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
2a4e0 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
2a4f0 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ce */...#ifndef 
2a500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
2a510 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
2a520 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
2a530 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
2a540 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
2a550 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
2a560 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
2a570 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
2a580 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
2a590 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
2a5a0 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
2a5b0 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
2a5c0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
2a5d0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
2a5e0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
2a5f0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
2a600 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
2a610 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
2a620 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2a630 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
2a640 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
2a650 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
2a660 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
2a670 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
2a680 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
2a690 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
2a6a0 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
2a6b0 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
2a6c0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
2a6d0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
2a6e0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
2a6f0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
2a700 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
2a710 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
2a720 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
2a730 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
2a740 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
2a750 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
2a760 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
2a770 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
2a780 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
2a790 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
2a7a0 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
2a7b0 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
2a7c0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
2a7d0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
2a7e0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
2a7f0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
2a800 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2a810 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a   on the page..**
2a820 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65 20 62  .** The pSpace b
2a830 75 66 66 65 72 20 69 73 20 75 73 65 64 20 74 6f  uffer is used to
2a840 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f 72 61   store a tempora
2a850 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65 20 64  ry copy of the d
2a860 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c 20 74  ivider.** cell t
2a870 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e 73 65  hat will be inse
2a880 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72 65 6e  rted into pParen
2a890 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c 20 63  t. Such a cell c
2a8a0 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34 0a 2a  onsists of a 4.*
2a8b0 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  * byte page numb
2a8c0 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  er followed by a
2a8d0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2a8e0 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f 74 68   integer. In oth
2a8f0 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 74 20  er.** words, at 
2a900 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e 20 48  most 13 bytes. H
2a910 65 6e 63 65 20 74 68 65 20 70 53 70 61 63 65 20  ence the pSpace 
2a920 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 61  buffer must be a
2a930 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20 62 79  t.** least 13 by
2a940 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
2a950 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2a960 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67 65  ce_quick(MemPage
2a970 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d 50 61   *pParent, MemPa
2a980 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
2a990 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68 61 72  Space){.  BtShar
2a9a0 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20 3d 20  ed *const pBt = 
2a9b0 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20 20 2f  pPage->pBt;    /
2a9c0 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62 61 73  * B-Tree Databas
2a9d0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
2a9e0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2aa00 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
2aa10 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2aa40 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2aa50 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 20    Pgno pgnoNew; 
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
2aa80 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20 2a 2f  umber of pNew */
2aa90 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
2aaa0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2aab0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
2aac0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2aad0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2aae0 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e  teable(pParent->
2aaf0 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
2ab00 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76  sert( pPage->nOv
2ab10 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a 20 20  erflow==1 );..  
2ab20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
2ab30 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  <=0 ) return SQL
2ab40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2ab50 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
2ab60 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54 68 69   a new page. Thi
2ab70 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
2ab80 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73 69 62  me the right-sib
2ab90 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20 70 50  ling of .  ** pP
2aba0 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20 70 61  age. Make the pa
2abb0 72 65 6e 74 20 70 61 67 65 20 77 72 69 74 61 62  rent page writab
2abc0 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20  le, so that the 
2abd0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
2abe0 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e 73  .  ** may be ins
2abf0 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68 20 74  erted. If both t
2ac00 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e 73 20  hese operations 
2ac10 61 72 65 20 73 75 63 63 65 73 73 66 75 6c 2c 20  are successful, 
2ac20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20  proceed..  */.  
2ac30 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
2ac40 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
2ac50 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
2ac60 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  0);..  if( rc==S
2ac70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20 20 20  QLITE_OK ){..   
2ac80 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70 53 70   u8 *pOut = &pSp
2ac90 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38 20 2a  ace[4];.    u8 *
2aca0 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
2acb0 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
2acc0 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20 3d 20     u16 szCell = 
2acd0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2ace0 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 75  e, pCell);.    u
2acf0 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20 20 61  8 *pStop;..    a
2ad00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2ad10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2ad20 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  New->pDbPage) );
2ad30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2ad40 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d 28 50  ge->aData[0]==(P
2ad50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
2ad60 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  AFDATA|PTF_LEAF)
2ad70 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2ad80 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54 4b 45  (pNew, PTF_INTKE
2ad90 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50  Y|PTF_LEAFDATA|P
2ada0 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 61 73  TF_LEAF);.    as
2adb0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
2adc0 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
2add0 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ell);..    /* If
2ade0 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
2adf0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
2ae00 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
2ae10 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
2ae20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
2ae30 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
2ae40 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
2ae50 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
2ae60 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
2ae70 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
2ae80 70 61 67 65 2e 20 49 66 20 65 69 74 68 65 72 20  page. If either 
2ae90 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20  of these.    ** 
2aea0 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69 6c 73  operations fails
2aeb0 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64  , the return cod
2aec0 65 20 69 73 20 73 65 74 2c 20 62 75 74 20 74 68  e is set, but th
2aed0 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 2a  e contents.    *
2aee0 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  * of the parent 
2aef0 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c 20 6d  page are still m
2af00 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20 74 68  anipulated by th
2af10 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a 20 20  h code below..  
2af20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f 6b 2c    ** That is Ok,
2af30 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   at this point t
2af40 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 69  he parent page i
2af50 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a  s guaranteed to.
2af60 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64      ** be marked
2af70 20 61 73 20 64 69 72 74 79 2e 20 52 65 74 75 72   as dirty. Retur
2af80 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
2af90 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20 61 0a  de will cause a.
2afa0 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2c      ** rollback,
2afb0 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63 68 61   undoing any cha
2afc0 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
2afd0 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
2afe0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41    */.    if( ISA
2aff0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2b000 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2b010 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
2b020 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2b030 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
2b040 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 3e 70      if( szCell>p
2b050 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26 26  New->minLocal &&
2b060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
2b080 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
2b090 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  pNew, pCell);.  
2b0a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
2b0b0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 64     /* Create a d
2b0c0 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f 20 69  ivider cell to i
2b0d0 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61 72 65  nsert into pPare
2b0e0 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65 72 20  nt. The divider 
2b0f0 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6e 73  cell.    ** cons
2b100 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79 74 65  ists of a 4-byte
2b110 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 74 68   page number (th
2b120 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
2b130 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20 20 20   pPage) and.    
2b140 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  ** a variable le
2b150 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65 20 28  ngth key value (
2b160 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 74 68  which must be th
2b170 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61 73 20  e same value as 
2b180 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65  the.    ** large
2b190 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67 65 29  st key on pPage)
2b1a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
2b1b0 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61 72 67  To find the larg
2b1c0 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20 6f 6e  est key value on
2b1d0 20 70 50 61 67 65 2c 20 66 69 72 73 74 20 66 69   pPage, first fi
2b1e0 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  nd the right-mos
2b1f0 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 20 6f  t .    ** cell o
2b200 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66 69 72  n pPage. The fir
2b210 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20 6f 66  st two fields of
2b220 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65 20 74   this cell are t
2b230 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72  he .    ** recor
2b240 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61 72 69  d-length (a vari
2b250 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65  able length inte
2b260 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32 2d 62  ger at most 32-b
2b270 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20 20 20  its in size).   
2b280 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65 79 20   ** and the key 
2b290 76 61 6c 75 65 20 28 61 20 76 61 72 69 61 62 6c  value (a variabl
2b2a0 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67 65 72  e length integer
2b2b0 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79 20 76  , may have any v
2b2c0 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20 54 68  alue)..    ** Th
2b2d0 65 20 66 69 72 73 74 20 6f 66 20 74 68 65 20 77  e first of the w
2b2e0 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 73 20  hile(...) loops 
2b2f0 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76 65 72  below skips over
2b300 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65 6e 67   the record-leng
2b310 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 2e  th.    ** field.
2b320 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68 69 6c   The second whil
2b330 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f 70 69  e(...) loop copi
2b340 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65  es the key value
2b350 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a   from the.    **
2b360 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 69   cell on pPage i
2b370 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62  nto the pSpace b
2b380 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  uffer..    */.  
2b390 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2b3a0 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ll(pPage, pPage-
2b3b0 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 70  >nCell-1);.    p
2b3c0 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b 39 5d  Stop = &pCell[9]
2b3d0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 28  ;.    while( (*(
2b3e0 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29 20 26  pCell++)&0x80) &
2b3f0 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20 29 3b  & pCell<pStop );
2b400 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43  .    pStop = &pC
2b410 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c  ell[9];.    whil
2b420 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29 20 3d  e( ((*(pOut++) =
2b430 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30 78 38   *(pCell++))&0x8
2b440 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f  0) && pCell<pSto
2b450 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  p );..    /* Ins
2b460 65 72 74 20 74 68 65 20 6e 65 77 20 64 69 76 69  ert the new divi
2b470 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 70 50  der cell into pP
2b480 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 6e  arent. */.    in
2b490 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
2b4a0 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2c  ,pParent->nCell,
2b4b0 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70 4f 75  pSpace,(int)(pOu
2b4c0 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50 61 67  t-pSpace),0,pPag
2b4d0 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 2f  e->pgno);..    /
2b4e0 2a 20 53 65 74 20 74 68 65 20 72 69 67 68 74 2d  * Set the right-
2b4f0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 6f 66  child pointer of
2b500 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f 69 6e   pParent to poin
2b510 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  t to the new pag
2b520 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  e. */.    put4by
2b530 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
2b540 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
2b550 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
2b560 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  w);.  .    /* Re
2b570 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
2b580 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70  nce to the new p
2b590 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65  age. */.    rele
2b5a0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
2b5b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2b5c0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2b5d0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
2b5e0 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20 30 0a  LANCE */..#if 0.
2b5f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b600 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ion does not con
2b610 74 72 69 62 75 74 65 20 61 6e 79 74 68 69 6e 67  tribute anything
2b620 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f   to the operatio
2b630 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a 2a 20  n of SQLite..** 
2b640 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  it is sometimes 
2b650 61 63 74 69 76 61 74 65 64 20 74 65 6d 70 6f 72  activated tempor
2b660 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65 62 75  arily while debu
2b670 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73 70 6f  gging code respo
2b680 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72 20 73  nsible .** for s
2b690 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72 2d 6d  etting pointer-m
2b6a0 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73  ap entries..*/.s
2b6b0 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
2b6c0 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d 50 61  CheckPages(MemPa
2b6d0 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69 6e 74  ge **apPage, int
2b6e0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69   nPage){.  int i
2b6f0 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  , j;.  for(i=0; 
2b700 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20  i<nPage; i++){. 
2b710 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20 20 75     Pgno n;.    u
2b720 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65  8 e;.    MemPage
2b730 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61 67 65   *pPage = apPage
2b740 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61 72 65  [i];.    BtShare
2b750 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
2b760 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  pBt;.    assert(
2b770 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
2b780 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ;..    for(j=0; 
2b790 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  j<pPage->nCell; 
2b7a0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65 6c 6c  j++){.      Cell
2b7b0 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
2b7c0 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a 20 20   u8 *z;.     .  
2b7d0 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65 6c 6c      z = findCell
2b7e0 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20 20 20  (pPage, j);.    
2b7f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
2b800 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
2b810 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  , z, &info);.   
2b820 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65     if( info.iOve
2b830 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
2b840 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74   Pgno ovfl = get
2b850 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e 69 4f  4byte(&z[info.iO
2b860 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
2b870 20 20 20 70 74 72 6d 61 70 47 65 74 28 70 42 74     ptrmapGet(pBt
2b880 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e 29 3b  , ovfl, &e, &n);
2b890 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b8a0 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20   n==pPage->pgno 
2b8b0 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  && e==PTRMAP_OVE
2b8c0 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20 20 20  RFLOW1 );.      
2b8d0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  }.      if( !pPa
2b8e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2b8f0 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 20 3d      Pgno child =
2b900 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a 20 20   get4byte(z);.  
2b910 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2b920 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2b930 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  &n);.        ass
2b940 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2b950 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2b960 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 20 20  _BTREE );.      
2b970 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2b980 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2b990 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2b9a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2b9b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2b9c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2b9d0 20 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28        ptrmapGet(
2b9e0 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65 2c 20  pBt, child, &e, 
2b9f0 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  &n);.      asser
2ba00 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2ba10 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 42  o && e==PTRMAP_B
2ba20 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a 20 20  TREE );.    }.  
2ba30 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
2ba40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
2ba50 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
2ba60 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68 65 20  sed to copy the 
2ba70 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
2ba80 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74 6f 72  b-tree node stor
2ba90 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65 20 70  ed .** on page p
2baa0 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f  From to page pTo
2bab0 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f 6d 20  . If page pFrom 
2bac0 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 70  was not a leaf p
2bad0 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  age, then.** the
2bae0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2baf0 72 69 65 73 20 66 6f 72 20 65 61 63 68 20 63 68  ries for each ch
2bb00 69 6c 64 20 70 61 67 65 20 61 72 65 20 75 70 64  ild page are upd
2bb10 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2bb20 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67 65 20  .** parent page 
2bb30 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 70 6f  stored in the po
2bb40 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70 61 67  inter map is pag
2bb50 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f 6d 20  e pTo. If pFrom 
2bb60 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61 6e 79  contained.** any
2bb70 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76 65 72   cells with over
2bb80 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
2bb90 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 72  rs, then the cor
2bba0 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69 6e 74  responding point
2bbb0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
2bbc0 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64 61 74  s are also updat
2bbd0 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 70  ed so that the p
2bbe0 61 72 65 6e 74 20 70 61 67 65 20 69 73 20 70 61  arent page is pa
2bbf0 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  ge pTo..**.** If
2bc00 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72 65 6e   pFrom is curren
2bc10 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61 6e 79  tly carrying any
2bc20 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
2bc30 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 0a  (entries in the.
2bc40 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76 66 6c  ** MemPage.aOvfl
2bc50 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65 79 20  [] array), they 
2bc60 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64 20 74  are not copied t
2bc70 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20 42 65  o pTo. .**.** Be
2bc80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
2bc90 70 61 67 65 20 70 54 6f 20 69 73 20 72 65 69 6e  page pTo is rein
2bca0 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e 67 20  itialized using 
2bcb0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2bcc0 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Page()..**.** Th
2bcd0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66  e performance of
2bce0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2bcf0 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c 2e 20  s not critical. 
2bd00 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  It is only used 
2bd10 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c 61 6e  by .** the balan
2bd20 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29 20 61  ce_shallower() a
2bd30 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65  nd balance_deepe
2bd40 72 28 29 20 70 72 6f 63 65 64 75 72 65 73 2c 20  r() procedures, 
2bd50 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 77 68  neither of.** wh
2bd60 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64 20 6f  ich are called o
2bd70 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72 6d 61  ften under norma
2bd80 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 2e  l circumstances.
2bd90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2bda0 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 4d  opyNodeContent(M
2bdb0 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c 20 4d  emPage *pFrom, M
2bdc0 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a 20 20  emPage *pTo){.  
2bdd0 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e 73 74  BtShared * const
2bde0 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e 70 42   pBt = pFrom->pB
2bdf0 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  t;.  u8 * const 
2be00 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 61  aFrom = pFrom->a
2be10 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Data;.  u8 * con
2be20 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e 61 44  st aTo = pTo->aD
2be30 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74  ata;.  int const
2be40 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46 72 6f   iFromHdr = pFro
2be50 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  m->hdrOffset;.  
2be60 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48 64 72  int const iToHdr
2be70 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f 3d 3d   = ((pTo->pgno==
2be80 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b 0a 20  1) ? 100 : 0);. 
2be90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2bea0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61 74 61  _OK;.  int iData
2beb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  ;..  assert( pFr
2bec0 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  om->isInit );.  
2bed0 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d 3e 6e  assert( pFrom->n
2bee0 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29 3b 0a  Free>=iToHdr );.
2bef0 20 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79    assert( get2by
2bf00 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2bf10 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75 73 61  dr+5])<=pBt->usa
2bf20 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20 2f 2a  bleSize );..  /*
2bf30 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72 65 65   Copy the b-tree
2bf40 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20 66 72   node content fr
2bf50 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20 74 6f  om page pFrom to
2bf60 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a 20 20   page pTo. */.  
2bf70 69 44 61 74 61 20 3d 20 67 65 74 32 62 79 74 65  iData = get2byte
2bf80 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72  (&aFrom[iFromHdr
2bf90 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
2bfa0 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61 46 72  aTo[iData], &aFr
2bfb0 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74 2d 3e  om[iData], pBt->
2bfc0 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61 74 61  usableSize-iData
2bfd0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61 54 6f  );.  memcpy(&aTo
2bfe0 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72 6f 6d  [iToHdr], &aFrom
2bff0 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46 72 6f  [iFromHdr], pFro
2c000 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  m->cellOffset + 
2c010 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c 29 3b  2*pFrom->nCell);
2c020 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69 61 6c  ..  /* Reinitial
2c030 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73 6f 20  ize page pTo so 
2c040 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2c050 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
2c060 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
2c070 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20 64 61  match the new da
2c080 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61 6c 69  ta. The initiali
2c090 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20 22 63  zation of pTo "c
2c0a0 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61 73 20  annot" fail, as 
2c0b0 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20 63 6f  the.  ** data co
2c0c0 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f 6d 20  pied from pFrom 
2c0d0 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 76  is known to be v
2c0e0 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54 6f 2d  alid.  */.  pTo-
2c0f0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 54  >isInit = 0;.  T
2c100 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29 20 73  ESTONLY(rc = ) s
2c110 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2c120 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73 73 65  age(pTo);.  asse
2c130 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2c140 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  K );..  /* If th
2c150 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
2c160 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75  cuum database, u
2c170 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2c180 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20  r-map entries.  
2c190 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74 72 65  ** for any b-tre
2c1a0 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70 61  e or overflow pa
2c1b0 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e 6f 77  ges that pTo now
2c1c0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
2c1d0 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a 20 20  inters to. */.  
2c1e0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2c1f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
2c200 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 54 6f  ChildPtrmaps(pTo
2c210 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2c220 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
2c230 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74  s routine redist
2c240 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20 6f 6e  ributes cells on
2c250 20 74 68 65 20 69 50 61 72 65 6e 74 49 64 78 27   the iParentIdx'
2c260 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  th child of pPar
2c270 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66 74 65  ent.** (hereafte
2c280 72 20 22 74 68 65 20 70 61 67 65 22 29 20 61 6e  r "the page") an
2c290 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c 69 6e  d up to 2 siblin
2c2a0 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  gs so that all p
2c2b0 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
2c2c0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d 6f 75  the.** same amou
2c2d0 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63 65  nt of free space
2c2e0 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69 6e 67  . Usually a sing
2c2f0 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20 65 69  le sibling on ei
2c300 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65  ther side of the
2c310 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75 73 65  .** page are use
2c320 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  d in the balanci
2c330 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74 68 20  ng, though both 
2c340 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63  siblings might c
2c350 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a 2a 20  ome from one.** 
2c360 73 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  side if the page
2c370 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 72   is the first or
2c380 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66 20 69   last child of i
2c390 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20 74 68  ts parent. If th
2c3a0 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73 20 66  e page .** has f
2c3b0 65 77 65 72 20 74 68 61 6e 20 32 20 73 69 62 6c  ewer than 2 sibl
2c3c0 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e 67 20  ings (something 
2c3d0 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79 20 68  which can only h
2c3e0 61 70 70 65 6e 20 69 66 20 74 68 65 20 70 61 67  appen if the pag
2c3f0 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74 20 70  e.** is a root p
2c400 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64 20 6f  age or a child o
2c410 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29 20 74  f a root page) t
2c420 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  hen all availabl
2c430 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 70 61  e siblings.** pa
2c440 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
2c450 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
2c460 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
2c470 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68 65 20  siblings of the 
2c480 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e  page might be in
2c490 63 72 65 61 73 65 64 20 6f 72 20 64 65 63 72 65  creased or decre
2c4a0 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e 65 20  ased by .** one 
2c4b0 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65 66 66  or two in an eff
2c4c0 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61 67 65  ort to keep page
2c4d0 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20 62 75  s nearly full bu
2c4e0 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e  t not over full.
2c4f0 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61   .**.** Note tha
2c500 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
2c510 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
2c520 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  ome of the cells
2c530 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
2c540 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75 61 6c  might not actual
2c550 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  ly be stored in 
2c560 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b 5d 2e  MemPage.aData[].
2c570 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
2c580 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67 65 20  .** if the page 
2c590 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54 68 69  is overfull. Thi
2c5a0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2c5b0 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c 6c 73  s that all cells
2c5c0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 74 6f   allocated.** to
2c5d0 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 69 74   the page and it
2c5e0 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74 20 69  s siblings fit i
2c5f0 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44 61 74  nto MemPage.aDat
2c600 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74 75 72  a[] before retur
2c610 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ning..**.** In t
2c620 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c  he course of bal
2c630 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67 65 20  ancing the page 
2c640 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
2c650 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65 0a 2a  , cells may be.*
2c660 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  * inserted into 
2c670 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  or removed from 
2c680 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2c690 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69 6e 67  (pParent). Doing
2c6a0 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75 73 65   so.** may cause
2c6b0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2c6c0 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
2c6d0 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c  ull or underfull
2c6e0 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68 61 70  . If this.** hap
2c6f0 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68 65 20  pens, it is the 
2c700 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2c710 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
2c720 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72 72 65  invoke the corre
2c730 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 20  ct.** balancing 
2c740 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78 20 74  routine to fix t
2c750 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73 65 65  his problem (see
2c760 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72   the balance() r
2c770 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a 2a 20  outine). .**.** 
2c780 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
2c790 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
2c7a0 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
2c7b0 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
2c7c0 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
2c7d0 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20 69 66  ted state. So if
2c7e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 61   this routine fa
2c7f0 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61 73  ils, the databas
2c800 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72  e should.** be r
2c810 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2c820 2a 20 54 68 65 20 74 68 69 72 64 20 61 72 67 75  * The third argu
2c830 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
2c840 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70 61 63  ction, aOvflSpac
2c850 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  e, is a pointer 
2c860 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72 20 70  to a.** buffer p
2c870 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 69  age-size bytes i
2c880 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e 20 69  n size. If, in i
2c890 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73 20 69  nserting cells i
2c8a0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 0a 2a  nto the parent.*
2c8b0 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e 74 29  * page (pParent)
2c8c0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  , the parent pag
2c8d0 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72 66 75  e becomes overfu
2c8e0 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65 72 20  ll, this buffer 
2c8f0 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73 74  is.** used to st
2c900 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74 73 20  ore the parents 
2c910 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
2c920 42 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  Because this fun
2c930 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a 2a 2a  ction inserts.**
2c940 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 66 6f   a maximum of fo
2c950 75 72 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  ur divider cells
2c960 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2c970 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65 20 6d   page, and the m
2c980 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65 20 6f  aximum.** size o
2c990 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65 64 20  f a cell stored 
2c9a0 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65 72 6e  within an intern
2c9b0 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  al node is alway
2c9c0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f 34 0a  s less than 1/4.
2c9d0 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2d 73  ** of the page-s
2c9e0 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c 53 70  ize, the aOvflSp
2c9f0 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69 73 20  ace[] buffer is 
2ca00 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2ca10 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68   large.** enough
2ca20 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66 6c 6f   for all overflo
2ca30 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49  w cells..**.** I
2ca40 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69 73 20  f aOvflSpace is 
2ca50 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20 70 6f  set to a null po
2ca60 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2ca70 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
2ca80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 2a   SQLITE_NOMEM..*
2ca90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2caa0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a 20 20  ance_nonroot(.  
2cab0 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2cac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cad0 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20 6f  /* Parent page o
2cae0 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69 6e 67  f siblings being
2caf0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 69   balanced */.  i
2cb00 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c 20 20  nt iParentIdx,  
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cb20 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68 65 20  * Index of "the 
2cb30 70 61 67 65 22 20 69 6e 20 70 50 61 72 65 6e 74  page" in pParent
2cb40 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66 6c 53   */.  u8 *aOvflS
2cb50 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
2cb60 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d 73 69        /* page-si
2cb70 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
2cb80 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f 76 66  e for parent ovf
2cb90 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 6f  l */.  int isRoo
2cba0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2cbb0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2cbc0 66 20 70 50 61 72 65 6e 74 20 69 73 20 61 20 72  f pParent is a r
2cbd0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  oot-page */.){. 
2cbe0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cc00 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62   The whole datab
2cc10 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ase */.  int nCe
2cc20 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2cc30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2cc40 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  of cells in apCe
2cc50 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ll[] */.  int nM
2cc60 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20  axCells = 0;    
2cc70 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
2cc80 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65  ted size of apCe
2cc90 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f  ll, szCell, aFro
2cca0 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  m. */.  int nNew
2ccb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ccc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ccd0 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77  f pages in apNew
2cce0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64  [] */.  int nOld
2ccf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cd00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2cd10 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64  f pages in apOld
2cd20 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a  [] */.  int i, j
2cd30 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
2cd40 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
2cd50 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  nters */.  int n
2cd60 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
2cd70 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
2cd80 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
2cd90 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
2cda0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2cdb0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
2cdc0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
2cdd0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6c   code */.  u16 l
2cde0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
2cdf0 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
2ce00 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
2ce10 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
2ce20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
2ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce40 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
2ce50 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
2ce60 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
2ce70 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
2ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ce90 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
2cea0 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
2ceb0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
2cec0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
2ced0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
2cee0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
2cef0 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
2cf00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cf10 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
2cf20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
2cf30 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
2cf40 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf60 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
2cf70 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
2cf80 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53 70 61  /.  int iOvflSpa
2cf90 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ce = 0;         
2cfa0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
2cfb0 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c 53 70   byte of aOvflSp
2cfc0 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ace[] */.  int s
2cfd0 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20 20  zScratch;       
2cfe0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2cff0 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72  of scratch memor
2d000 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  y requested */. 
2d010 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b   MemPage *apOld[
2d020 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  NB];          /*
2d030 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
2d040 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f   two siblings */
2d050 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f  .  MemPage *apCo
2d060 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20  py[NB];         
2d070 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65  /* Private copie
2d080 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67  s of apOld[] pag
2d090 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2d0a0 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20  *apNew[NB+2];   
2d0b0 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
2d0c0 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69  d up to NB sibli
2d0d0 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  ngs after balanc
2d0e0 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70 52 69  ing */.  u8 *pRi
2d0f0 67 68 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ght;            
2d100 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
2d110 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66 20 72  n in parent of r
2d120 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70 6f 69  ight-sibling poi
2d130 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 61 70  nter */.  u8 *ap
2d140 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20 20 20  Div[NB-1];      
2d150 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
2d160 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
2d170 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
2d180 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
2d190 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
2d1a0 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
2d1b0 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
2d1c0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
2d1d0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
2d1e0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
2d1f0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
2d200 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
2d210 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
2d220 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d230 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
2d240 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
2d250 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
2d280 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
2d290 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
2d2a0 61 53 70 61 63 65 31 3b 20 20 20 20 20 20 20 20  aSpace1;        
2d2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
2d2c0 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20  e for copies of 
2d2d0 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 2a  dividers cells *
2d2e0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d300 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74 6f 20   /* Temp var to 
2d310 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e 75 6d  store a page num
2d320 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70 42 74  ber in */..  pBt
2d330 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3b   = pParent->pBt;
2d340 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d350 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2d360 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2d370 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2d380 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2d390 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
2d3a0 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54 52 41   );..#if 0.  TRA
2d3b0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65  CE(("BALANCE: be
2d3c0 67 69 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c  gin page %d chil
2d3d0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67  d of %d\n", pPag
2d3e0 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74  e->pgno, pParent
2d3f0 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64 69 66  ->pgno));.#endif
2d400 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
2d410 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d 61 79  oint pParent may
2d420 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e   have at most on
2d430 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2e  e overflow cell.
2d440 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 69   And if.  ** thi
2d450 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20  s overflow cell 
2d460 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74 20 6d  is present, it m
2d470 75 73 74 20 62 65 20 74 68 65 20 63 65 6c 6c 20  ust be the cell 
2d480 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64 65 78  with .  ** index
2d490 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54 68 69   iParentIdx. Thi
2d4a0 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d 65 73  s scenario comes
2d4b0 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68 69 73   about when this
2d4c0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69   function.  ** i
2d4d0 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69 72 65  s called (indire
2d4e0 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c 69 74  ctly) from sqlit
2d4f0 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29 2e  e3BtreeDelete().
2d500 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
2d510 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2d520 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e  ==0 || pParent->
2d530 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a  nOverflow==1 );.
2d540 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
2d550 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  t->nOverflow==0 
2d560 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66  || pParent->aOvf
2d570 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72 65 6e  l[0].idx==iParen
2d580 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28 20 21  tIdx );..  if( !
2d590 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a 20 20  aOvflSpace ){.  
2d5a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d5b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
2d5c0 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c 69 6e   Find the siblin
2d5d0 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c 61 6e  g pages to balan
2d5e0 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74 65 20  ce. Also locate 
2d5f0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  the cells in pPa
2d600 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61 74 20  rent .  ** that 
2d610 64 69 76 69 64 65 20 74 68 65 20 73 69 62 6c 69  divide the sibli
2d620 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70 74 20  ngs. An attempt 
2d630 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20  is made to find 
2d640 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 0a  NN siblings on .
2d650 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69 64 65    ** either side
2d660 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72 65 20   of pPage. More 
2d670 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b  siblings are tak
2d680 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65  en from one side
2d690 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20 2a 2a  , however, .  **
2d6a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 66 65   if there are fe
2d6b0 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
2d6c0 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
2d6d0 72 20 73 69 64 65 2e 20 49 66 20 70 50 61 72 65  r side. If pPare
2d6e0 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f  nt.  ** has NB o
2d6f0 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e  r fewer children
2d700 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72   then all childr
2d710 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72  en of pParent ar
2d720 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a 2a 0a  e taken.  .  **.
2d730 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
2d740 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20 64 69  lso drops the di
2d750 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2d760 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2d770 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61 79 2c  . This.  ** way,
2d780 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
2d790 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
2d7a0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
2d7b0 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a 20 20  deal with any.  
2d7c0 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ** overflow cell
2d7d0 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20  s in the parent 
2d7e0 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e 65 20  page, as if one 
2d7f0 65 78 69 73 74 65 64 20 69 74 20 68 61 73 20 61  existed it has a
2d800 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65 65 6e  lready.  ** been
2d810 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a 20 20   removed.  */.  
2d820 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  i = pParent->nOv
2d830 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65 6e 74  erflow + pParent
2d840 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28 20 69  ->nCell;.  if( i
2d850 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <2 ){.    nxDiv 
2d860 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20  = 0;.    nOld = 
2d870 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  i+1;.  }else{.  
2d880 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20 20 20    nOld = 3;.    
2d890 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d 3d  if( iParentIdx==
2d8a0 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  0 ){            
2d8b0 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78 44 69       .      nxDi
2d8c0 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  v = 0;.    }else
2d8d0 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78 3d   if( iParentIdx=
2d8e0 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78 44 69  =i ){.      nxDi
2d8f0 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d 65 6c  v = i-2;.    }el
2d900 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69 76 20  se{.      nxDiv 
2d910 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31 3b 0a  = iParentIdx-1;.
2d920 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 32 3b      }.    i = 2;
2d930 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b 6e 78  .  }.  if( (i+nx
2d940 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2d950 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65 6e 74  erflow)==pParent
2d960 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70  ->nCell ){.    p
2d970 52 69 67 68 74 20 3d 20 26 70 50 61 72 65 6e 74  Right = &pParent
2d980 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2d990 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b 0a 20  >hdrOffset+8];. 
2d9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
2d9b0 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ht = findCell(pP
2d9c0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2d9d0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2d9e0 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f 20 3d  w);.  }.  pgno =
2d9f0 20 67 65 74 34 62 79 74 65 28 70 52 69 67 68 74   get4byte(pRight
2da00 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  );.  while( 1 ){
2da10 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64  .    rc = getAnd
2da20 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67  InitPage(pBt, pg
2da30 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a  no, &apOld[i]);.
2da40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2da50 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f 6c 64      memset(apOld
2da60 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28 4d 65  , 0, i*sizeof(Me
2da70 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20 20 20  mPage*));.      
2da80 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2da90 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  anup;.    }.    
2daa0 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61  nMaxCells += 1+a
2dab0 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61  pOld[i]->nCell+a
2dac0 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c  pOld[i]->nOverfl
2dad0 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69 2d 2d  ow;.    if( (i--
2dae0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 0a 20  )==0 ) break;.. 
2daf0 20 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e     if( pParent->
2db00 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69 2b 6e  nOverflow && i+n
2db10 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 61  xDiv==pParent->a
2db20 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b 0a 20  Ovfl[0].idx ){. 
2db30 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
2db40 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c 5b 30  pParent->aOvfl[0
2db50 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 70  ].pCell;.      p
2db60 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2db70 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2db80 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2db90 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2dba0 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20  apDiv[i]);.     
2dbb0 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66   pParent->nOverf
2dbc0 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  low = 0;.    }el
2dbd0 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b  se{.      apDiv[
2dbe0 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
2dbf0 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70  arent, i+nxDiv-p
2dc00 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2dc10 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 20 3d  w);.      pgno =
2dc20 20 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b   get4byte(apDiv[
2dc30 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 77  i]);.      szNew
2dc40 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2dc50 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69 76  r(pParent, apDiv
2dc60 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  [i]);..      /* 
2dc70 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20 66 72  Drop the cell fr
2dc80 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2dc90 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73 74 69  ge. apDiv[i] sti
2dca0 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20 20 20  ll points to.   
2dcb0 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 20 77     ** the cell w
2dcc0 69 74 68 69 6e 20 74 68 65 20 70 61 72 65 6e 74  ithin the parent
2dcd0 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74  , even though it
2dce0 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70 70 65   has been droppe
2dcf0 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73  d..      ** This
2dd00 20 69 73 20 73 61 66 65 20 62 65 63 61 75 73 65   is safe because
2dd10 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65 6c 6c   dropping a cell
2dd20 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 73   only overwrites
2dd30 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 20   the first.     
2dd40 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73 20 6f   ** four bytes o
2dd50 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73 20 66  f it, and this f
2dd60 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
2dd70 20 6e 65 65 64 20 74 68 65 20 66 69 72 73 74 0a   need the first.
2dd80 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2dd90 74 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  tes of the divid
2dda0 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68 65 20  er cell. So the 
2ddb0 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66 65 20  pointer is safe 
2ddc0 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  to use.      ** 
2ddd0 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20 20 20  later on.  .    
2dde0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 6e    **.      ** Un
2ddf0 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73 20 63  less SQLite is c
2de00 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63 75 72  ompiled in secur
2de10 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e 20 49  e-delete mode. I
2de20 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20 20 20  n this case,.   
2de30 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70 43 65     ** the dropCe
2de40 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c  ll() routine wil
2de50 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 20  l overwrite the 
2de60 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69 74 68  entire cell with
2de70 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20 20 2a   zeroes..      *
2de80 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  * In this case, 
2de90 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f 70 79  temporarily copy
2dea0 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f 20 74   the cell into t
2deb0 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b 5d 0a  he aOvflSpace[].
2dec0 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 2e        ** buffer.
2ded0 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f 70 69   It will be copi
2dee0 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61 73 20  ed out again as 
2def0 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53 70 61  soon as the aSpa
2df00 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20 20 20  ce[] buffer.    
2df10 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65    ** is allocate
2df20 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  d.  */.#ifdef SQ
2df30 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
2df40 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  TE.      memcpy(
2df50 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69  &aOvflSpace[apDi
2df60 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44  v[i]-pParent->aD
2df70 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d 2c 20  ata], apDiv[i], 
2df80 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 20  szNew[i]);.     
2df90 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61 4f 76   apDiv[i] = &aOv
2dfa0 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b 69 5d  flSpace[apDiv[i]
2dfb0 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5d  -pParent->aData]
2dfc0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  ;.#endif.      d
2dfd0 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2dfe0 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74   i+nxDiv-pParent
2dff0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73 7a 4e  ->nOverflow, szN
2e000 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ew[i]);.    }.  
2e010 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
2e020 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
2e030 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
2e040 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
2e050 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
2e060 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
2e070 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
2e080 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
2e090 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
2e0a0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
2e0b0 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 6b 20  ctures.  */.  k 
2e0c0 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
2e0d0 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  + ROUND8(sizeof(
2e0e0 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73 7a 53  MemPage));.  szS
2e0f0 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20  cratch =.       
2e100 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2e110 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20  (u8*)           
2e120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2e130 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  pCell */.     + 
2e140 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66  nMaxCells*sizeof
2e150 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20  (u16)           
2e160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2e170 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20  zCell */.     + 
2e180 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
2e1b0 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
2e1c0 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20   k*nOld;        
2e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e1f0 50 61 67 65 20 63 6f 70 69 65 73 20 28 61 70 43  Page copies (apC
2e200 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65 6c 6c  opy) */.  apCell
2e210 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63   = sqlite3Scratc
2e220 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74  hMalloc( szScrat
2e230 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43  ch ); .  if( apC
2e240 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ell==0 ){.    rc
2e250 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e260 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
2e270 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
2e280 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29   szCell = (u16*)
2e290 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c  &apCell[nMaxCell
2e2a0 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20 3d 20  s];.  aSpace1 = 
2e2b0 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
2e2c0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
2e2d0 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
2e2e0 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65 31 29  IGNMENT(aSpace1)
2e2f0 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c   );..  /*.  ** L
2e300 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
2e310 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
2e320 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
2e330 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2e340 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
2e350 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
2e360 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
2e370 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
2e380 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
2e390 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
2e3a0 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  from aSpace1[] a
2e3b0 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
2e3c0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
2e3d0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
2e3e0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
2e3f0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
2e400 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
2e410 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
2e420 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
2e430 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
2e440 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
2e450 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
2e460 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
2e470 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
2e480 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
2e490 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
2e4a0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
2e4b0 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
2e4c0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
2e4d0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
2e4e0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
2e4f0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
2e500 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
2e510 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
2e520 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
2e530 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
2e540 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
2e550 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
2e560 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
2e570 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
2e580 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
2e590 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
2e5a0 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
2e5b0 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
2e5c0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
2e5d0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
2e5e0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
2e5f0 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   */.  leafCorrec
2e600 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d  tion = apOld[0]-
2e610 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
2e620 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d 2d 3e  ata = apOld[0]->
2e630 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
2e640 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
2e650 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 3b  {.    int limit;
2e660 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42 65 66  .    .    /* Bef
2e670 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
2e680 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20 61 20  ng else, take a 
2e690 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27 74 68  copy of the i'th
2e6a0 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c 69 6e   original siblin
2e6b0 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 73  g.    ** The res
2e6c0 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
2e6d0 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
2e6e0 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
2e6f0 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a 20 74   rather.    ** t
2e700 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
2e710 20 70 61 67 65 73 20 73 69 6e 63 65 20 74 68 65   pages since the
2e720 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
2e730 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20  will be in the. 
2e740 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66     ** process of
2e750 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
2e760 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  en.  */.    MemP
2e770 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f  age *pOld = apCo
2e780 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
2e790 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e  *)&aSpace1[pBt->
2e7a0 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69 5d 3b  pageSize + k*i];
2e7b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2e7c0 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65  , apOld[i], size
2e7d0 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20  of(MemPage));.  
2e7e0 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20 3d 20    pOld->aData = 
2e7f0 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31 5d 3b  (void*)&pOld[1];
2e800 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 6c 64  .    memcpy(pOld
2e810 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69  ->aData, apOld[i
2e820 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70  ]->aData, pBt->p
2e830 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20 20 6c  ageSize);..    l
2e840 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65  imit = pOld->nCe
2e850 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  ll+pOld->nOverfl
2e860 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ow;.    for(j=0;
2e870 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a   j<limit; j++){.
2e880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2e890 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2e8a0 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2e8b0 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66  ell] = findOverf
2e8c0 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29  lowCell(pOld, j)
2e8d0 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e  ;.      szCell[n
2e8e0 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  Cell] = cellSize
2e8f0 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c  Ptr(pOld, apCell
2e900 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20 20  [nCell]);.      
2e910 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nCell++;.    }. 
2e920 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20     if( i<nOld-1 
2e930 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b 0a 20  && !leafData){. 
2e940 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20 28 75       u16 sz = (u
2e950 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20 20 20  16)szNew[i];.   
2e960 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
2e970 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2e980 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  l<nMaxCells );. 
2e990 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
2e9a0 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 70  l] = sz;.      p
2e9b0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b  Temp = &aSpace1[
2e9c0 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20  iSpace1];.      
2e9d0 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20  iSpace1 += sz;. 
2e9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
2e9f0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
2ea00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2ea10 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
2ea20 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
2ea30 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
2ea40 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20  apDiv[i], sz);. 
2ea50 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
2ea60 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
2ea70 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2ea80 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72   assert( leafCor
2ea90 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20 6c 65  rection==0 || le
2eaa0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
2eab0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
2eac0 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c 6c 5b  nCell] = szCell[
2ead0 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43 6f 72  nCell] - leafCor
2eae0 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 69  rection;.      i
2eaf0 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
2eb00 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2eb10 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
2eb20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
2eb30 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68 64 72  ssert( pOld->hdr
2eb40 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20 20 20  Offset==0 );.   
2eb50 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68       /* The righ
2eb60 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  t pointer of the
2eb70 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64   child page pOld
2eb80 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66   becomes the lef
2eb90 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69  t.        ** poi
2eba0 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
2ebb0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
2ebc0 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c      memcpy(apCel
2ebd0 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d  l[nCell], &pOld-
2ebe0 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20  >aData[8], 4);. 
2ebf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2ec00 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66      assert( leaf
2ec10 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b  Correction==4 );
2ec20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 43  .        if( szC
2ec30 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a  ell[nCell]<4 ){.
2ec40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2ec50 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65  not allow any ce
2ec60 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  lls smaller than
2ec70 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20   4 bytes. */.   
2ec80 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
2ec90 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
2eca0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ecb0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
2ecc0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2ecd0 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e  Figure out the n
2ece0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e  umber of pages n
2ecf0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c  eeded to hold al
2ed00 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20  l nCell cells.. 
2ed10 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e   ** Store this n
2ed20 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41  umber in "k".  A
2ed30 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65  lso compute szNe
2ed40 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65  w[] which is the
2ed50 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65   total.  ** size
2ed60 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   of all cells on
2ed70 20 74 68 65 20 69 2d 74 68 20 70 61 67 65 20 61   the i-th page a
2ed80 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63  nd cntNew[] whic
2ed90 68 20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20  h is the index. 
2eda0 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20   ** in apCell[] 
2edb0 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74  of the cell that
2edc0 20 64 69 76 69 64 65 73 20 70 61 67 65 20 69 20   divides page i 
2edd0 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20  from page i+1.  
2ede0 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20  .  ** cntNew[k] 
2edf0 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65  should equal nCe
2ee00 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  ll..  **.  ** Va
2ee10 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79  lues computed by
2ee20 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a   this block:.  *
2ee30 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  *.  **          
2ee40 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75   k: The total nu
2ee50 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20  mber of sibling 
2ee60 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a  pages.  **    sz
2ee70 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75  New[i]: Spaced u
2ee80 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20  sed on the i-th 
2ee90 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
2eea0 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20  **   cntNew[i]: 
2eeb0 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b  Index in apCell[
2eec0 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66  ] and szCell[] f
2eed0 6f 72 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  or the first cel
2eee0 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20  l to.  **       
2eef0 20 20 20 20 20 20 20 74 68 65 20 72 69 67 68 74         the right
2ef00 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73 69 62   of the i-th sib
2ef10 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20  ling page..  ** 
2ef20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d  usableSpace: Num
2ef30 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
2ef40 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2ef50 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e  on each sibling.
2ef60 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73  .  ** .  */.  us
2ef70 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d  ableSpace = pBt-
2ef80 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32  >usableSize - 12
2ef90 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f   + leafCorrectio
2efa0 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61  n;.  for(subtota
2efb0 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  l=k=i=0; i<nCell
2efc0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
2efd0 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( i<nMaxCells 
2efe0 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20  );.    subtotal 
2eff0 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32  += szCell[i] + 2
2f000 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74 6f 74  ;.    if( subtot
2f010 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65  al > usableSpace
2f020 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b   ){.      szNew[
2f030 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20  k] = subtotal - 
2f040 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  szCell[i];.     
2f050 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a   cntNew[k] = i;.
2f060 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
2f070 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ta ){ i--; }.   
2f080 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b     subtotal = 0;
2f090 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20  .      k++;.    
2f0a0 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29 7b 20    if( k>NB+1 ){ 
2f0b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f0c0 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61 6e 63  UPT; goto balanc
2f0d0 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20 20 20  e_cleanup; }.   
2f0e0 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b   }.  }.  szNew[k
2f0f0 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20  ] = subtotal;.  
2f100 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c  cntNew[k] = nCel
2f110 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a  l;.  k++;..  /*.
2f120 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69 6e 67    ** The packing
2f130 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65   computed by the
2f140 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20   previous block 
2f150 69 73 20 62 69 61 73 65 64 20 74 6f 77 61 72 64  is biased toward
2f160 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a 20 20   the siblings.  
2f170 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 73  ** on the left s
2f180 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74 20 73  ide.  The left s
2f190 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c 77 61  iblings are alwa
2f1a0 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20  ys nearly full, 
2f1b0 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72  while the.  ** r
2f1c0 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e  ight-most siblin
2f1d0 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61 72 6c  g might be nearl
2f1e0 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 62  y empty.  This b
2f1f0 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61 74 74  lock of code att
2f200 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64  empts.  ** to ad
2f210 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69 6e 67  just the packing
2f220 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74 6f 20   of siblings to 
2f230 67 65 74 20 61 20 62 65 74 74 65 72 20 62 61 6c  get a better bal
2f240 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ance..  **.  ** 
2f250 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20  This adjustment 
2f260 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20  is more than an 
2f270 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54  optimization.  T
2f280 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f 76 65  he packing above
2f290 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65 20 73   might.  ** be s
2f2a0 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e 63 65  o out of balance
2f2b0 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65 67 61   as to be illega
2f2c0 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  l.  For example,
2f2d0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a   the right-most.
2f2e0 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67    ** sibling mig
2f2f0 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  ht be completely
2f300 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20 61 64   empty.  This ad
2f310 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20  justment is not 
2f320 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20  optional..  */. 
2f330 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b   for(i=k-1; i>0;
2f340 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73   i--){.    int s
2f350 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69  zRight = szNew[i
2f360 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  ];  /* Size of s
2f370 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 72 69  ibling on the ri
2f380 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  ght */.    int s
2f390 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d  zLeft = szNew[i-
2f3a0 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73  1]; /* Size of s
2f3b0 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65  ibling on the le
2f3c0 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b  ft */.    int r;
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f3e0 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
2f3f0 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66  most cell in lef
2f400 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20  t sibling */.   
2f410 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20 20 20   int d;         
2f420 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2f430 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 74   first cell to t
2f440 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67 68 74  he left of right
2f450 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20   sibling */..   
2f460 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d   r = cntNew[i-1]
2f470 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20 72 20   - 1;.    d = r 
2f480 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
2f490 20 20 20 20 61 73 73 65 72 74 28 20 64 3c 6e 4d      assert( d<nM
2f4a0 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61  axCells );.    a
2f4b0 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c  ssert( r<nMaxCel
2f4c0 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ls );.    while(
2f4d0 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73   szRight==0 || s
2f4e0 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d  zRight+szCell[d]
2f4f0 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65  +2<=szLeft-(szCe
2f500 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20  ll[r]+2) ){.    
2f510 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43    szRight += szC
2f520 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[d] + 2;.    
2f530 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65    szLeft -= szCe
2f540 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20  ll[r] + 2;.     
2f550 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a   cntNew[i-1]--;.
2f560 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77        r = cntNew
2f570 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20  [i-1] - 1;.     
2f580 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61   d = r + 1 - lea
2f590 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20  fData;.    }.   
2f5a0 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69   szNew[i] = szRi
2f5b0 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69  ght;.    szNew[i
2f5c0 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20  -1] = szLeft;.  
2f5d0 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 20 77  }..  /* Either w
2f5e0 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d  e found one or m
2f5f0 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65  ore cells (cntne
2f600 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50 61 67  w[0])>0) or pPag
2f610 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69 72 74  e is.  ** a virt
2f620 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20  ual root page.  
2f630 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  A virtual root p
2f640 61 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20  age is when the 
2f650 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70  real root.  ** p
2f660 61 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e  age is page 1 an
2f670 64 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c  d we are the onl
2f680 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20  y child of that 
2f690 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  page..  */.  ass
2f6a0 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30  ert( cntNew[0]>0
2f6b0 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67   || (pParent->pg
2f6c0 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74  no==1 && pParent
2f6d0 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a  ->nCell==0) );..
2f6e0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2f6f0 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64  E: old: %d %d %d
2f700 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64 5b 30    ",.    apOld[0
2f710 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20 6e 4f  ]->pgno, .    nO
2f720 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b 31 5d  ld>=2 ? apOld[1]
2f730 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20 20 20  ->pgno : 0,.    
2f740 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c 64 5b  nOld>=3 ? apOld[
2f750 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20 20 29  2]->pgno : 0.  )
2f760 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
2f770 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
2f780 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
2f790 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
2f7a0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
2f7b0 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 3c 3d  apOld[0]->pgno<=
2f7c0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
2f7d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
2f7e0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2f7f0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 70 61  leanup;.  }.  pa
2f800 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c 64 5b  geFlags = apOld[
2f810 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20  0]->aData[0];.  
2f820 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b  for(i=0; i<k; i+
2f830 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  +){.    MemPage 
2f840 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20 69  *pNew;.    if( i
2f850 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  <nOld ){.      p
2f860 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d  New = apNew[i] =
2f870 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20   apOld[i];.     
2f880 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
2f890 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f8a0 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
2f8b0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f8c0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
2f8d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2f8e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2f8f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f900 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
2f910 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
2f920 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2f930 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c 20 70   &pNew, &pgno, p
2f940 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  gno, 0);.      i
2f950 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
2f960 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2f970 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70      apNew[i] = p
2f980 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  New;.      nNew+
2f990 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 65 74  +;..      /* Set
2f9a0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
2f9b0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6e   entry for the n
2f9c0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
2f9d0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 49 53   */.      if( IS
2f9e0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2f9f0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2fa00 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e  pPut(pBt, pNew->
2fa10 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
2fa20 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e  EE, pParent->pgn
2fa30 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
2fa40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fa50 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2fa60 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2fa70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fa80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2fa90 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20  /* Free any old 
2faa0 70 61 67 65 73 20 74 68 61 74 20 77 65 72 65 20  pages that were 
2fab0 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20 6e 65  not reused as ne
2fac0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20  w pages..  */.  
2fad0 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b  while( i<nOld ){
2fae0 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2faf0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2fb00 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2fb10 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2fb20 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2fb30 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
2fb40 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20  apOld[i] = 0;.  
2fb50 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a    i++;.  }..  /*
2fb60 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65  .  ** Put the ne
2fb70 77 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  w pages in accen
2fb80 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69  ding order.  Thi
2fb90 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20  s helps to.  ** 
2fba0 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20  keep entries in 
2fbb0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e  the disk file in
2fbc0 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74 20 61   order so that a
2fbd0 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68   scan.  ** of th
2fbe0 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e  e table is a lin
2fbf0 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68  ear scan through
2fc00 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74   the file.  That
2fc10 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65  .  ** in turn he
2fc20 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e  lps the operatin
2fc30 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69  g system to deli
2fc40 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66  ver pages.  ** f
2fc50 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72  rom the disk mor
2fc60 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a  e rapidly..  **.
2fc70 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69    ** An O(n^2) i
2fc80 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c  nsertion sort al
2fc90 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c  gorithm is used,
2fca0 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20   but since.  ** 
2fcb0 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  n is never more 
2fcc0 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c  than NB (a small
2fcd0 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74   constant), that
2fce0 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74   should.  ** not
2fcf0 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20   be a problem.. 
2fd00 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42   **.  ** When NB
2fd10 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70  ==3, this one op
2fd20 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73  timization makes
2fd30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
2fd40 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66 61 73  ** about 25% fas
2fd50 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e  ter for large in
2fd60 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c  sertions and del
2fd70 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  etions..  */.  f
2fd80 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69  or(i=0; i<k-1; i
2fd90 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  ++){.    int min
2fda0 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e 70 67  V = apNew[i]->pg
2fdb0 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49  no;.    int minI
2fdc0 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = i;.    for(j=
2fdd0 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a  i+1; j<k; j++){.
2fde0 20 20 20 20 20 20 69 66 28 20 61 70 4e 65 77 5b        if( apNew[
2fdf0 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69 67 6e  j]->pgno<(unsign
2fe00 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20  ed)minV ){.     
2fe10 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20     minI = j;.   
2fe20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70 4e 65       minV = apNe
2fe30 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20  w[j]->pgno;.    
2fe40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2fe50 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20  ( minI>i ){.    
2fe60 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d    int t;.      M
2fe70 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20 20 20  emPage *pT;.    
2fe80 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e    t = apNew[i]->
2fe90 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54 20 3d  pgno;.      pT =
2fea0 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20   apNew[i];.     
2feb0 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
2fec0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61  w[minI];.      a
2fed0 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
2fee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
2fef0 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25 64 29  CE(("new: %d(%d)
2ff00 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
2ff10 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22 2c  d(%d) %d(%d)\n",
2ff20 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d 3e 70  .    apNew[0]->p
2ff30 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20  gno, szNew[0],. 
2ff40 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61 70 4e     nNew>=2 ? apN
2ff50 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[1]->pgno : 0,
2ff60 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77   nNew>=2 ? szNew
2ff70 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [1] : 0,.    nNe
2ff80 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32 5d 2d  w>=3 ? apNew[2]-
2ff90 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e  >pgno : 0, nNew>
2ffa0 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20  =3 ? szNew[2] : 
2ffb0 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f  0,.    nNew>=4 ?
2ffc0 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e 6f 20   apNew[3]->pgno 
2ffd0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73  : 0, nNew>=4 ? s
2ffe0 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20  zNew[3] : 0,.   
2fff0 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e 65 77   nNew>=5 ? apNew
30000 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e  [4]->pgno : 0, n
30010 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34  New>=5 ? szNew[4
30020 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73 73 65  ] : 0));..  asse
30030 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
30040 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
30050 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
30060 0a 20 20 70 75 74 34 62 79 74 65 28 70 52 69 67  .  put4byte(pRig
30070 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  ht, apNew[nNew-1
30080 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 0a  ]->pgno);..  /*.
30090 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
300a0 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
300b0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
300c0 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
300d0 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
300e0 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
300f0 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
30100 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
30110 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
30120 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
30130 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
30140 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
30150 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
30160 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
30170 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
30180 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
30190 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
301a0 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
301b0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
301c0 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d  pNew, cntNew[i]-
301d0 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  j, &apCell[j], &
301e0 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20  szCell[j]);.    
301f0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43  assert( pNew->nC
30200 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d  ell>0 || (nNew==
30210 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d  1 && cntNew[0]==
30220 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  0) );.    assert
30230 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f  ( pNew->nOverflo
30240 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a 20 3d  w==0 );..    j =
30250 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20   cntNew[i];..   
30260 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69   /* If the sibli
30270 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng page assemble
30280 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20  d above was not 
30290 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73  the right-most s
302a0 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69  ibling,.    ** i
302b0 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72 20  nsert a divider 
302c0 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61  cell into the pa
302d0 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  rent page..    *
302e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  /.    assert( i<
302f0 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e 43 65  nNew-1 || j==nCe
30300 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3c  ll );.    if( j<
30310 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75  nCell ){.      u
30320 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20  8 *pCell;.      
30330 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
30340 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20   int sz;..      
30350 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65  assert( j<nMaxCe
30360 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70 43 65  lls );.      pCe
30370 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a  ll = apCell[j];.
30380 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c        sz = szCel
30390 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65  l[j] + leafCorre
303a0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65  ction;.      pTe
303b0 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61 63 65  mp = &aOvflSpace
303c0 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a 20 20  [iOvflSpace];.  
303d0 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
303e0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
303f0 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
30400 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
30410 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
30420 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
30430 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
30440 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
30450 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
30460 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
30470 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
30480 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
30490 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
304a0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
304b0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
304c0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
304d0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
304e0 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
304f0 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
30500 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
30510 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
30520 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
30530 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
30540 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30550 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
30560 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
30570 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
30580 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
30590 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
305a0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
305b0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
305c0 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b 20 70        sz = 4 + p
305d0 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
305e0 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a  4], info.nKey);.
305f0 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20          pTemp = 
30600 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
30610 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d          pCell -=
30620 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   4;.        /* O
30630 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72 20  bscure case for 
30640 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72  non-leaf-data tr
30650 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c  ees: If the cell
30660 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20   at pCell was.  
30670 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
30680 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20  sly stored on a 
30690 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69  leaf node, and i
306a0 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65  ts reported size
306b0 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a   was 4.        *
306c0 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74  * bytes, then it
306d0 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65   may actually be
306e0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
306f0 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28  is .        ** (
30700 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  see sqlite3Btree
30710 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20  ParseCellPtr(), 
30720 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20 6d  4 bytes is the m
30730 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20  inimum size of. 
30740 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65         ** any ce
30750 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20 69  ll). But it is i
30760 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73  mportant to pass
30770 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a   the correct siz
30780 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a  e to .        **
30790 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73   insertCell(), s
307a0 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63 65  o reparse the ce
307b0 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20  ll now..        
307c0 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f  **.        ** No
307d0 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61 6e  te that this can
307e0 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e   never happen in
307f0 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20   an SQLite data 
30800 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20  file, as all.   
30810 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72       ** cells ar
30820 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  e at least 4 byt
30830 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70  es. It only happ
30840 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75  ens in b-trees u
30850 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  sed.        ** t
30860 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28  o evaluate "IN (
30870 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64  SELECT ...)" and
30880 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73   similar clauses
30890 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
308a0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
308b0 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  j]==4 ){.       
308c0 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f     assert(leafCo
308d0 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20  rrection==4);.  
308e0 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
308f0 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
30900 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  , pCell);.      
30910 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30920 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b 3d 20    iOvflSpace += 
30930 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
30940 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
30950 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
30960 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70 61 63  ssert( iOvflSpac
30970 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e<=pBt->pageSize
30980 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   );.      rc = i
30990 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e  nsertCell(pParen
309a0 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c  t, nxDiv, pCell,
309b0 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e 65 77   sz, pTemp, pNew
309c0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  ->pgno);.      i
309d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
309e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
309f0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61  cleanup;.      a
30a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
30a10 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
30a20 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
30a30 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a   );..      j++;.
30a40 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
30a50 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
30a60 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
30a70 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
30a80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
30a90 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
30aa0 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
30ab0 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38  AF)==0 ){.    u8
30ac0 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f   *zChild = &apCo
30ad0 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74  py[nOld-1]->aDat
30ae0 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  a[8];.    memcpy
30af0 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d  (&apNew[nNew-1]-
30b00 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c  >aData[8], zChil
30b10 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  d, 4);.  }..  if
30b20 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50 61 72  ( isRoot && pPar
30b30 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  ent->nCell==0 &&
30b40 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66   pParent->hdrOff
30b50 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  set<=apNew[0]->n
30b60 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Free ){.    /* T
30b70 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
30b80 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77 20 63  the b-tree now c
30b90 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
30ba0 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62 6c 69  . The only sibli
30bb0 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 69  ng.    ** page i
30bc0 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
30bd0 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 2e  d of the parent.
30be0 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   Copy the conten
30bf0 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ts of the.    **
30c00 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e 74 6f   child page into
30c10 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64 65 63   the parent, dec
30c20 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76 65 72  reasing the over
30c30 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20 74 68  all height of th
30c40 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20  e.    ** b-tree 
30c50 73 74 72 75 63 74 75 72 65 20 62 79 20 6f 6e 65  structure by one
30c60 2e 20 54 68 69 73 20 69 73 20 64 65 73 63 72 69  . This is descri
30c70 62 65 64 20 61 73 20 74 68 65 20 22 62 61 6c 61  bed as the "bala
30c80 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22 0a 20  nce-shallower". 
30c90 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f 72 69     ** sub-algori
30ca0 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f 63 75  thm in some docu
30cb0 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  mentation..    *
30cc0 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73  *.    ** If this
30cd0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
30ce0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  um database, the
30cf0 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e 6f 64   call to copyNod
30d00 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20 20 20  eContent() .    
30d10 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f 69 6e  ** sets all poin
30d20 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20  ter-map entries 
30d30 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
30d40 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
30d50 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 66 6f  pages .    ** fo
30d60 72 20 77 68 69 63 68 20 74 68 65 20 70 6f 69 6e  r which the poin
30d70 74 65 72 20 69 73 20 73 74 6f 72 65 64 20 77 69  ter is stored wi
30d80 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  thin the content
30d90 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e 0a 20   being copied.. 
30da0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
30db0 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74 20 62   second assert b
30dc0 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20 74 68  elow verifies th
30dd0 61 74 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  at the child pag
30de0 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e 74 65  e is defragmente
30df0 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d 75 73  d.    ** (it mus
30e00 74 20 62 65 2c 20 61 73 20 69 74 20 77 61 73 20  t be, as it was 
30e10 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75 63 74  just reconstruct
30e20 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d 62 6c  ed using assembl
30e30 65 50 61 67 65 28 29 29 2e 20 54 68 69 73 0a 20  ePage()). This. 
30e40 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72 74 61     ** is importa
30e50 6e 74 20 69 66 20 74 68 65 20 70 61 72 65 6e 74  nt if the parent
30e60 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
30e70 20 62 65 20 70 61 67 65 20 31 20 6f 66 20 74 68   be page 1 of th
30e80 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
30e90 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20 20 20  * image.  */.   
30ea0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d 3d 31   assert( nNew==1
30eb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30ec0 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65 65 20  apNew[0]->nFree 
30ed0 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67 65 74  == .        (get
30ee0 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30 5d 2d  2byte(&apNew[0]-
30ef0 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e 65 77  >aData[5])-apNew
30f00 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2d  [0]->cellOffset-
30f10 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c 6c 2a  apNew[0]->nCell*
30f20 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  2) .    );.    i
30f30 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  f( SQLITE_OK==(r
30f40 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  c = copyNodeCont
30f50 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20 70 50  ent(apNew[0], pP
30f60 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20 20 20  arent)) ){.     
30f70 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 61   rc = freePage(a
30f80 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20 7d 0a  pNew[0]);.    }.
30f90 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53 41 55    }else if( ISAU
30fa0 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
30fb0 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69 6e 74  /* Fix the point
30fc0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
30fd0 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73  or all the cells
30fe0 20 74 68 61 74 20 77 65 72 65 20 73 68 69 66 74   that were shift
30ff0 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20 20 20  ed around. .    
31000 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73 65 76  ** There are sev
31010 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74 20 74  eral different t
31020 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65 72 2d  ypes of pointer-
31030 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68 61 74  map entries that
31040 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20   need to.    ** 
31050 62 65 20 64 65 61 6c 74 20 77 69 74 68 20 62 79  be dealt with by
31060 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 53   this routine. S
31070 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68 61 76  ome of these hav
31080 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72 65 61  e been set alrea
31090 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a 20 6d  dy, but.    ** m
310a0 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20 54 68  any have not. Th
310b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
310c0 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20 2a 2a   summary:.    **
310d0 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54 68 65  .    **   1) The
310e0 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61   entries associa
310f0 74 65 64 20 77 69 74 68 20 6e 65 77 20 73 69 62  ted with new sib
31100 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61 74 20  ling pages that 
31110 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  were not.    ** 
31120 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20 77 68       siblings wh
31130 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
31140 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54 68 65   was called. The
31150 73 65 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  se have already.
31160 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65 65 6e      **      been
31170 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74 20 6e   set. We don't n
31180 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61 62 6f  eed to worry abo
31190 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67 73 20  ut old siblings 
311a0 74 68 61 74 20 77 65 72 65 0a 20 20 20 20 2a 2a  that were.    **
311b0 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f 20 74        moved to t
311c0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d 20 74  he free-list - t
311d0 68 65 20 66 72 65 65 50 61 67 65 28 29 20 63 6f  he freePage() co
311e0 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63 61 72  de has taken car
311f0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 66  e.    **      of
31200 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a 0a 20   those..    **. 
31210 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65 20 70     **   2) The p
31220 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
31230 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
31240 74 68 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  th the first ove
31250 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20 20 20  rflow.    **    
31260 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20 6f 76    page in any ov
31270 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20 75 73  erflow chains us
31280 65 64 20 62 79 20 6e 65 77 20 64 69 76 69 64 65  ed by new divide
31290 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65 20 0a  r cells. These .
312a0 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61 76 65      **      have
312b0 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20 62 65   also already be
312c0 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20 6f 66  en taken care of
312d0 20 62 79 20 74 68 65 20 69 6e 73 65 72 74 43 65   by the insertCe
312e0 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20 20 2a  ll() code..    *
312f0 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20 49 66  *.    **   3) If
31300 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
31310 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65  es are not leave
31320 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
31330 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20 20 2a  d pages of.    *
31340 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73 74 6f  *      cells sto
31350 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62 6c 69  red on the sibli
31360 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e 65 65  ng pages may nee
31370 64 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  d to be updated.
31380 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
31390 20 34 29 20 49 66 20 74 68 65 20 73 69 62 6c 69   4) If the sibli
313a0 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74  ng pages are not
313b0 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b 65 79   internal intkey
313c0 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61 6e 79   nodes, then any
313d0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f 76 65  .    **      ove
313e0 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73 65 64  rflow pages used
313f0 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c 73 20   by these cells 
31400 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75  may need to be u
31410 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20 20 20  pdated.    **   
31420 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69 6e 74     (internal int
31430 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65 72 20  key nodes never 
31440 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73  contain pointers
31450 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
31460 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  es)..    **.    
31470 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65 20 73  **   5) If the s
31480 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65  ibling pages are
31490 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65   not leaves, the
314a0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
314b0 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 65 6e  p.    **      en
314c0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 72 69  tries for the ri
314d0 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65 73 20  ght-child pages 
314e0 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e 67 20  of each sibling 
314f0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
31500 20 20 20 20 20 74 6f 20 62 65 20 75 70 64 61 74       to be updat
31510 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
31520 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20 32 20  * Cases 1 and 2 
31530 61 72 65 20 64 65 61 6c 74 20 77 69 74 68 20 61  are dealt with a
31540 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20 63 6f  bove by other co
31550 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20 20 20  de. The next.   
31560 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20   ** block deals 
31570 77 69 74 68 20 63 61 73 65 73 20 33 20 61 6e 64  with cases 3 and
31580 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65 20 61   4 and the one a
31590 66 74 65 72 20 74 68 61 74 2c 20 63 61 73 65 20  fter that, case 
315a0 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20  5. Since.    ** 
315b0 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e 74 65  setting a pointe
315c0 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73 20 61  r map entry is a
315d0 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78 70 65   relatively expe
315e0 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2c  nsive operation,
315f0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63 6f 64   this.    ** cod
31600 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f 69 6e  e only sets poin
31610 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20  ter map entries 
31620 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  for child or ove
31630 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68 61 74  rflow pages that
31640 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61 63 74   have.    ** act
31650 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65 74 77  ually moved betw
31660 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f 0a 20  een pages.  */. 
31670 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77     MemPage *pNew
31680 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20 20 20   = apNew[0];.   
31690 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
316a0 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20 20 20   apCopy[0];.    
316b0 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  int nOverflow = 
316c0 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
316d0 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74 4f 6c  .    int iNextOl
316e0 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20  d = pOld->nCell 
316f0 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  + nOverflow;.   
31700 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77 20 3d   int iOverflow =
31710 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20 70 4f   (nOverflow ? pO
31720 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
31730 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20 3d 20   : -1);.    j = 
31740 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
31750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31760 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64 27 20  * Current 'old' 
31770 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a  sibling page */.
31780 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20 20 20      k = 0;      
31790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317a0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
317b0 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e 67 20  t 'new' sibling 
317c0 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  page */.    for(
317d0 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26 26 20  i=0; i<nCell && 
317e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
317f0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
31800 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a 20 20  sDivider = 0;.  
31810 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d 69 4e      while( i==iN
31820 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  extOld ){.      
31830 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74    /* Cell i is t
31840 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74  he cell immediat
31850 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
31860 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6f  e last cell on o
31870 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69  ld.        ** si
31880 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20 49 66  bling page j. If
31890 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
318a0 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73  e not leaf pages
318b0 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a   of an.        *
318c0 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c  * intkey b-tree,
318d0 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77 61 73   then cell i was
318e0 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 2e   a divider cell.
318f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f 6c 64   */.        pOld
31900 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d 3b 0a   = apCopy[++j];.
31910 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f 6c 64          iNextOld
31920 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
31930 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 20 2b   + pOld->nCell +
31940 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pOld->nOverflow
31950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
31960 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  ld->nOverflow ){
31970 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76 65 72  .          nOver
31980 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76  flow = pOld->nOv
31990 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20  erflow;.        
319a0 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20 69 20    iOverflow = i 
319b0 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20 70 4f  + !leafData + pO
319c0 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ld->aOvfl[0].idx
319d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
319e0 20 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20      isDivider = 
319f0 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20 20 20  !leafData;  .   
31a00 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73 65     }..      asse
31a10 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  rt(nOverflow>0 |
31a20 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20 29 3b  | iOverflow<i );
31a30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4f  .      assert(nO
31a40 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70 4f 6c  verflow<2 || pOl
31a50 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d  d->aOvfl[0].idx=
31a60 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31 5d 2e  =pOld->aOvfl[1].
31a70 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20 61 73  idx-1);.      as
31a80 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 33  sert(nOverflow<3
31a90 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b   || pOld->aOvfl[
31aa0 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f  1].idx==pOld->aO
31ab0 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b 0a 20  vfl[2].idx-1);. 
31ac0 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f 76 65       if( i==iOve
31ad0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
31ae0 20 69 73 44 69 76 69 64 65 72 20 3d 20 31 3b 0a   isDivider = 1;.
31af0 20 20 20 20 20 20 20 20 69 66 28 20 28 2d 2d 6e          if( (--n
31b00 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b 0a 20  Overflow)>0 ){. 
31b10 20 20 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c           iOverfl
31b20 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ow++;.        }.
31b30 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
31b40 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b 5d 20  f( i==cntNew[k] 
31b50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 65  ){.        /* Ce
31b60 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65 6c 6c  ll i is the cell
31b70 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
31b80 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20  lowing the last 
31b90 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20 20 20  cell on new.    
31ba0 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 70      ** sibling p
31bb0 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20 73 69  age k. If the si
31bc0 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c  blings are not l
31bd0 65 61 66 20 70 61 67 65 73 20 6f 66 20 61 6e 0a  eaf pages of an.
31be0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 6b 65          ** intke
31bf0 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e 20 63  y b-tree, then c
31c00 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76 69 64  ell i is a divid
31c10 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 20  er cell.  */.   
31c20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
31c30 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  w[++k];.        
31c40 69 66 28 20 21 6c 65 61 66 44 61 74 61 20 29 20  if( !leafData ) 
31c50 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
31c60 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
31c70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
31c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a  .      assert( j
31c90 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20 20 61  <nOld );.      a
31ca0 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20 29 3b  ssert( k<nNew );
31cb0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
31cc0 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69 67 69  e cell was origi
31cd0 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20 63 65  nally divider ce
31ce0 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74 20 6e  ll (and is not n
31cf0 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ow) or.      ** 
31d00 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  an overflow cell
31d10 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65 6c 6c  , or if the cell
31d20 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20   was located on 
31d30 61 20 64 69 66 66 65 72 65 6e 74 20 73 69 62 6c  a different sibl
31d40 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ing.      ** pag
31d50 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 6c  e before the bal
31d60 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74 68 65  ancing, then the
31d70 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
31d80 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ries associated.
31d90 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 61 6e        ** with an
31da0 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65 72 66  y child or overf
31db0 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64 20 74  low pages need t
31dc0 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20 20 2a  o be updated.  *
31dd0 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44 69  /.      if( isDi
31de0 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d 3e 70  vider || pOld->p
31df0 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20  gno!=pNew->pgno 
31e00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
31e10 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 29  leafCorrection )
31e20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
31e30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
31e40 67 65 74 34 62 79 74 65 28 61 70 43 65 6c 6c 5b  get4byte(apCell[
31e50 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  i]), PTRMAP_BTRE
31e60 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a  E, pNew->pgno);.
31e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e80 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69 5d 3e    if( szCell[i]>
31e90 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 26  pNew->minLocal &
31ea0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
31eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
31ec0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  = ptrmapPutOvflP
31ed0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
31ee0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
31ef0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
31f00 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65    if( !leafCorre
31f10 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 66  ction ){.      f
31f20 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
31f30 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65 77 3b  TE_OK && i<nNew;
31f40 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72   i++){.        r
31f50 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 0a 09  c = ptrmapPut(..
31f60 20 20 20 20 70 42 74 2c 20 67 65 74 34 62 79 74      pBt, get4byt
31f70 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61 44 61  e(&apNew[i]->aDa
31f80 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ta[8]), PTRMAP_B
31f90 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d 2d 3e  TREE, apNew[i]->
31fa0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pgno);.      }. 
31fb0 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 20 20     }..#if 0.    
31fc0 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43 68 65  /* The ptrmapChe
31fd0 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74 61 69  ckPages() contai
31fe0 6e 73 20 61 73 73 65 72 74 28 29 20 73 74 61 74  ns assert() stat
31ff0 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65 72 69  ements that veri
32000 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61  fy that.    ** a
32010 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  ll pointer map p
32020 61 67 65 73 20 61 72 65 20 73 65 74 20 63 6f 72  ages are set cor
32030 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69 73 20  rectly. This is 
32040 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20 0a 20  helpful while . 
32050 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e 67 2e     ** debugging.
32060 20 54 68 69 73 20 69 73 20 75 73 75 61 6c 6c 79   This is usually
32070 20 64 69 73 61 62 6c 65 64 20 62 65 63 61 75 73   disabled becaus
32080 65 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  e a corrupt data
32090 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a 2a 20  base may.    ** 
320a0 63 61 75 73 65 20 61 6e 20 61 73 73 65 72 74 28  cause an assert(
320b0 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 66  ) statement to f
320c0 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70 74 72  ail.  */.    ptr
320d0 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28 61 70  mapCheckPages(ap
320e0 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  New, nNew);.    
320f0 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73  ptrmapCheckPages
32100 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 23  (&pParent, 1);.#
32110 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73  endif.  }..  ass
32120 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69 73  ert( pParent->is
32130 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43 45 28  Init );.  TRACE(
32140 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73  ("BALANCE: finis
32150 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d  hed: old=%d new=
32160 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
32170 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64 2c 20            nOld, 
32180 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 0a  nNew, nCell));..
32190 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75    /*.  ** Cleanu
321a0 70 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  p before returni
321b0 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65  ng..  */.balance
321c0 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69  _cleanup:.  sqli
321d0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
321e0 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
321f0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
32200 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
32210 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
32220 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
32230 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
32240 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
32250 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ]);.  }..  retur
32260 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
32270 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
32280 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
32290 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
322a0 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
322b0 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20   is.** overfull 
322c0 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  (has one or more
322d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
322e0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 63 68  ..**.** A new ch
322f0 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c 6c 6f  ild page is allo
32300 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 63 6f  cated and the co
32310 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 75  ntents of the cu
32320 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20 70 61  rrent root.** pa
32330 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 76  ge, including ov
32340 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20 61 72  erflow cells, ar
32350 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  e copied into th
32360 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72 6f 6f  e child. The roo
32370 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74 68 65  t.** page is the
32380 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20 74 6f  n overwritten to
32390 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d 70 74   make it an empt
323a0 79 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20  y page with the 
323b0 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a 2a 20  right-child .** 
323c0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69 6e 67  pointer pointing
323d0 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65   to the new page
323e0 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72  ..**.** Before r
323f0 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20 70 6f  eturning, all po
32400 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
32410 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
32420 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74 68 61  to pages .** tha
32430 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 2d  t the new child-
32440 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  page now contain
32450 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 72  s pointers to ar
32460 65 20 75 70 64 61 74 65 64 2e 20 54 68 65 0a 2a  e updated. The.*
32470 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73 70 6f  * entry correspo
32480 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nding to the new
32490 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69   right-child poi
324a0 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  nter of the root
324b0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c 73 6f  .** page is also
324c0 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
324d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
324e0 70 70 43 68 69 6c 64 20 69 73 20 73 65 74 20 74  ppChild is set t
324f0 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65 66 65  o contain a refe
32500 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 68 69  rence to the chi
32510 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e 64 20  ld .** page and 
32520 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
32530 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  urned. In this c
32540 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72 20 69  ase the caller i
32550 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f  s required.** to
32560 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61 67   call releasePag
32570 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c 64 20  e() on *ppChild 
32580 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20 49 66  exactly once. If
32590 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
325a0 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f  ,.** an error co
325b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
325c0 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73  nd *ppChild is s
325d0 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74 61 74  et to 0..*/.stat
325e0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64  ic int balance_d
325f0 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  eeper(MemPage *p
32600 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  Root, MemPage **
32610 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e 74 20  ppChild){.  int 
32620 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
32630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
32640 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
32650 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f  subprocedures */
32660 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69  .  MemPage *pChi
32670 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
32680 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
32690 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
326a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43   */.  Pgno pgnoC
326b0 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  hild;           
326c0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
326d0 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
326e0 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
326f0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
32700 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20 2f 2a  Root->pBt;    /*
32710 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 0a 20   The BTree */.. 
32720 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
32730 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20  nOverflow>0 );. 
32740 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
32750 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
32760 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
32770 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74 68 65   Make pRoot, the
32780 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
32790 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74 61 62  e b-tree, writab
327a0 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  le. Allocate a n
327b0 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20 74 68  ew .  ** page th
327c0 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
327d0 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69  he new right-chi
327e0 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43 6f 70  ld of pPage. Cop
327f0 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20  y the contents. 
32800 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64 65 20   ** of the node 
32810 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f 74 20  stored on pRoot 
32820 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63 68 69  into the new chi
32830 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ld page..  */.  
32840 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
32850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32860 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
32870 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53 51  bPage)).   || SQ
32880 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 61  LITE_OK!=(rc = a
32890 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
328a0 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26 70 67  (pBt,&pChild,&pg
328b0 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d 3e 70  noChild,pRoot->p
328c0 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20 53 51  gno,0)).   || SQ
328d0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 63  LITE_OK!=(rc = c
328e0 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 70  opyNodeContent(p
328f0 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29 0a 20  Root, pChild)). 
32900 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41 43 55    || (ISAUTOVACU
32910 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20 53 51  UM && .       SQ
32920 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 70  LITE_OK!=(rc = p
32930 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
32940 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41 50 5f  noChild, PTRMAP_
32950 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e 70 67  BTREE, pRoot->pg
32960 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 2a  no))).  ){.    *
32970 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 20  ppChild = 0;.   
32980 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 68   releasePage(pCh
32990 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
329a0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
329b0 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
329c0 73 77 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c  swriteable(pChil
329d0 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  d->pDbPage) );. 
329e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
329f0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
32a00 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
32a10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
32a20 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 52 6f  hild->nCell==pRo
32a30 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ot->nCell );..  
32a40 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
32a50 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
32a60 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f 74 2d  to %d\n", pRoot-
32a70 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
32a80 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  gno));..  /* Cop
32a90 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  y the overflow c
32aa0 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f 74 20  ells from pRoot 
32ab0 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 6d  to pChild */.  m
32ac0 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f  emcpy(pChild->aO
32ad0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f 76 66  vfl, pRoot->aOvf
32ae0 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72 66  l, pRoot->nOverf
32af0 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f 6f 74  low*sizeof(pRoot
32b00 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20  ->aOvfl[0]));.  
32b10 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
32b20 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65 72  w = pRoot->nOver
32b30 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f  flow;..  /* Zero
32b40 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32b50 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69 6e 73   pRoot. Then ins
32b60 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73 20 74  tall pChild as t
32b70 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 2e 20  he right-child. 
32b80 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 52  */.  zeroPage(pR
32b90 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  oot, pChild->aDa
32ba0 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
32bb0 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
32bc0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
32bd0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
32be0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 0a 20  , pgnoChild);.. 
32bf0 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43 68 69   *ppChild = pChi
32c00 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ld;.  return SQL
32c10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
32c20 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 70   The page that p
32c30 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  Cur currently po
32c40 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75 73 74  ints to has just
32c50 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 69   been modified i
32c60 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e 20 54  n.** some way. T
32c70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 67  his function fig
32c80 75 72 65 73 20 6f 75 74 20 69 66 20 74 68 69 73  ures out if this
32c90 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 6d 65   modification me
32ca0 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65 65 20  ans the.** tree 
32cb0 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61  needs to be bala
32cc0 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73 6f 20  nced, and if so 
32cd0 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72 6f 70  calls the approp
32ce0 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20  riate balancing 
32cf0 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42 61 6c  .** routine. Bal
32d00 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  ancing routines 
32d10 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62 61 6c  are:.**.**   bal
32d20 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a 2a 20  ance_quick().** 
32d30 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72    balance_deeper
32d40 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f  ().**   balance_
32d50 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73 74 61  nonroot().*/.sta
32d60 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28  tic int balance(
32d70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
32d80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
32d90 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74 20 69  TE_OK;.  const i
32da0 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72 2d 3e  nt nMin = pCur->
32db0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
32dc0 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20 61 42  * 2 / 3;.  u8 aB
32dd0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
32de0 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46 72 65  [13];.  u8 *pFre
32df0 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54 4f 4e  e = 0;..  TESTON
32e00 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  LY( int balance_
32e10 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d 20 30  quick_called = 0
32e20 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20   );.  TESTONLY( 
32e30 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  int balance_deep
32e40 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20 29 3b  er_called = 0 );
32e50 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 6e 74  ..  do {.    int
32e60 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69   iPage = pCur->i
32e70 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50 61 67  Page;.    MemPag
32e80 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
32e90 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 3b 0a  >apPage[iPage];.
32ea0 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3d 3d  .    if( iPage==
32eb0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
32ec0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
32ed0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
32ee0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
32ef0 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f 76 65  he b-tree is ove
32f00 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63  rfull. In this c
32f10 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20 20 20  ase call the.   
32f20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f       ** balance_
32f30 64 65 65 70 65 72 28 29 20 66 75 6e 63 74 69 6f  deeper() functio
32f40 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  n to create a ne
32f50 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68 65 20  w child for the 
32f60 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20  root-page.      
32f70 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20 74 68    ** and copy th
32f80 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
32f90 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70  ts of the root-p
32fa0 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 0a 20  age to it. The. 
32fb0 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 69         ** next i
32fc0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
32fd0 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c  do-loop will bal
32fe0 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64 20 70  ance the child p
32ff0 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 20  age..        */ 
33000 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
33010 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
33020 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
33030 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
33040 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70 50 61  lance_deeper(pPa
33050 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ge, &pCur->apPag
33060 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  e[1]);.        i
33070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
33090 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b 0a 20  ur->iPage = 1;. 
330a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
330b0 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
330c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
330d0 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20  dx[1] = 0;.     
330e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
330f0 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e 6e 4f  r->apPage[1]->nO
33100 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20 20 20  verflow );.     
33110 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
33120 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
33130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
33140 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  se if( pPage->nO
33150 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
33160 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d 69 6e  age->nFree<=nMin
33170 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
33180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33190 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f 6e 73    MemPage * cons
331a0 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72  t pParent = pCur
331b0 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 2d 31  ->apPage[iPage-1
331c0 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6f 6e  ];.      int con
331d0 73 74 20 69 49 64 78 20 3d 20 70 43 75 72 2d 3e  st iIdx = pCur->
331e0 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d 3b 0a  aiIdx[iPage-1];.
331f0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
33200 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
33210 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
33220 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
33230 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 6e  QLITE_OK ){.#ifn
33240 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33250 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20 20 20  QUICKBALANCE.   
33260 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
33270 68 61 73 44 61 74 61 0a 20 20 20 20 20 20 20 20  hasData.        
33280 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
33290 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20 20 20  flow==1.        
332a0 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   && pPage->aOvfl
332b0 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
332c0 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 26  nCell.         &
332d0 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
332e0 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  =1.         && p
332f0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 69  Parent->nCell==i
33300 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  Idx.        ){. 
33310 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c           /* Call
33320 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
33330 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
33340 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50 61 67   sibling of pPag
33350 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 20  e on which.     
33360 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f 72 65       ** to store
33370 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
33380 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ll. balance_quic
33390 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20 6e 65  k() inserts a ne
333a0 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20 20 20  w cell.         
333b0 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65 6e 74   ** into pParent
333c0 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61 75 73  , which may caus
333d0 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72 66 6c  e pParent overfl
333e0 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20  ow. If this.    
333f0 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73        ** happens
33400 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74 65 72  , the next inter
33410 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d  ation of the do-
33420 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61 6e 63  loop will balanc
33430 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20 20 20  e pParent .     
33440 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69 74 68       ** use eith
33450 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  er balance_nonro
33460 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63 65 5f  ot() or balance_
33470 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69 6c 20  deeper(). Until 
33480 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
33490 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 6f  * happens, the o
334a0 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69 73 20  verflow cell is 
334b0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 42  stored in the aB
334c0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
334d0 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  [].          ** 
334e0 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20 20 20  buffer. .       
334f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
33500 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65 20 6f  ** The purpose o
33510 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
33520 61 73 73 65 72 74 28 29 20 69 73 20 74 6f 20 63  assert() is to c
33530 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79 20 61  heck that only a
33540 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
33550 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62 61 6c  ngle call to bal
33560 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
33570 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20 63 61  made for each ca
33580 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20 20 20  ll to this.     
33590 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
335a0 2e 20 49 66 20 74 68 69 73 20 77 65 72 65 20 6e  . If this were n
335b0 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61 20 73  ot verified, a s
335c0 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f 6c 76  ubtle bug involv
335d0 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20 20 20  ing reuse.      
335e0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 61 42      ** of the aB
335f0 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
33600 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  [] might sneak i
33610 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  n..          */.
33620 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
33630 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ( (balance_quick
33640 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20 29 3b  _called++)==0 );
33650 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
33660 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70 50  balance_quick(pP
33670 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20 61 42  arent, pPage, aB
33680 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61 63 65  alanceQuickSpace
33690 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
336a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
336b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
336c0 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63 61 6c  n this case, cal
336d0 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  l balance_nonroo
336e0 74 28 29 20 74 6f 20 72 65 64 69 73 74 72 69 62  t() to redistrib
336f0 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20 20 20  ute cells.      
33700 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 70      ** between p
33710 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 32  Page and up to 2
33720 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e 67 20   of its sibling 
33730 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e 76 6f  pages. This invo
33740 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a  lves.          *
33750 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  * modifying the 
33760 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 61 72  contents of pPar
33770 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63  ent, which may c
33780 61 75 73 65 20 70 50 61 72 65 6e 74 20 74 6f 0a  ause pParent to.
33790 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 63            ** bec
337a0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  ome overfull or 
337b0 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65 20 6e  underfull. The n
337c0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
337d0 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20 20 20   the do-loop.   
337e0 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62         ** will b
337f0 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
33800 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72 65 63  t page to correc
33810 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20  t this..        
33820 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20 20    ** .          
33830 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65 6e 74  ** If the parent
33840 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76   page becomes ov
33850 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76 65 72  erfull, the over
33860 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63 65 6c  flow cell or cel
33870 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ls.          ** 
33880 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68  are stored in th
33890 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
338a0 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65 64 69  allocated immedi
338b0 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a 20 20  ately below. .  
338c0 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73 75 62          ** A sub
338d0 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
338e0 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70  n of the do-loop
338f0 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74 68 20   will deal with 
33900 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
33910 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62 61 6c    ** calling bal
33920 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 28  ance_nonroot() (
33930 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 29  balance_deeper()
33940 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 66   may be called f
33950 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20 20 20  irst,.          
33960 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73 6e 27  ** but it doesn'
33970 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76 65 72  t deal with over
33980 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a 75 73  flow cells - jus
33990 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74 6f 20  t moves them to 
339a0 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 64  a.          ** d
339b0 69 66 66 65 72 65 6e 74 20 70 61 67 65 29 2e 20  ifferent page). 
339c0 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73 65 71  Once this subseq
339d0 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62 61 6c  uent call to bal
339e0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 20 0a  ance_nonroot() .
339f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
33a00 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74 20 69   completed, it i
33a10 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65 61 73  s safe to releas
33a20 65 20 74 68 65 20 70 53 70 61 63 65 20 62 75 66  e the pSpace buf
33a30 66 65 72 20 75 73 65 64 20 62 79 0a 20 20 20 20  fer used by.    
33a40 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65        ** the pre
33a50 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73 20 74  vious call, as t
33a60 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
33a70 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76 65 20   data will have 
33a80 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 20 20  been .          
33a90 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68 65 72  ** copied either
33aa0 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f   into the body o
33ab0 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
33ac0 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20 6e 65  e or into the ne
33ad0 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  w.          ** p
33ae0 53 70 61 63 65 20 62 75 66 66 65 72 20 70 61 73  Space buffer pas
33af0 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74 74 65  sed to the latte
33b00 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61 6e 63  r call to balanc
33b10 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20 20 20  e_nonroot()..   
33b20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
33b30 20 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d      u8 *pSpace =
33b40 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
33b50 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e 70 61  oc(pCur->pBt->pa
33b60 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
33b70 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
33b80 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e 74 2c  nonroot(pParent,
33b90 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c 20 69   iIdx, pSpace, i
33ba0 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20 20 20  Page==1);.      
33bb0 20 20 20 20 69 66 28 20 70 46 72 65 65 20 29 7b      if( pFree ){
33bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
33bd0 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f 74 20  If pFree is not 
33be0 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74 73 20  NULL, it points 
33bf0 74 6f 20 74 68 65 20 70 53 70 61 63 65 20 62 75  to the pSpace bu
33c00 66 66 65 72 20 75 73 65 64 20 0a 20 20 20 20 20  ffer used .     
33c10 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61 20 70         ** by a p
33c20 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
33c30 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
33c40 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74 73 20  ). Its contents 
33c50 61 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  are.            
33c60 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20 65 69  ** now stored ei
33c70 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64 61 74  ther on real dat
33c80 61 62 61 73 65 20 70 61 67 65 73 20 6f 72 20 77  abase pages or w
33c90 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20 20 20  ithin the .     
33ca0 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20 70 53         ** new pS
33cb0 70 61 63 65 20 62 75 66 66 65 72 2c 20 73 6f 20  pace buffer, so 
33cc0 69 74 20 6d 61 79 20 62 65 20 73 61 66 65 6c 79  it may be safely
33cd0 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a 2f 0a   freed here. */.
33ce0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
33cf0 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72 65  te3PageFree(pFre
33d00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
33d10 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
33d20 65 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20  e pSpace buffer 
33d30 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 61 66  will be freed af
33d40 74 65 72 20 74 68 65 20 6e 65 78 74 20 63 61 6c  ter the next cal
33d50 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  l to.          *
33d60 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  * balance_nonroo
33d70 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62 65 66  t(), or just bef
33d80 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ore this functio
33d90 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69 63 68  n returns, which
33da0 65 76 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a  ever.          *
33db0 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e 20 2a  * comes first. *
33dc0 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 65  /.          pFre
33dd0 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20 20 20  e = pSpace;.    
33de0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
33df0 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
33e00 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 20 20  rflow = 0;..    
33e10 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 69 74    /* The next it
33e20 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
33e30 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65 73 20  o-loop balances 
33e40 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
33e50 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
33e60 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
33e70 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d      pCur->iPage-
33e80 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c  -;.    }.  }whil
33e90 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
33ea0 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72 65 65   );..  if( pFree
33eb0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   ){.    sqlite3P
33ec0 61 67 65 46 72 65 65 28 70 46 72 65 65 29 3b 0a  ageFree(pFree);.
33ed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
33ee0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  .}.../*.** Inser
33ef0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
33f00 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20 20  nto the BTree.  
33f10 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65 6e  The key is given
33f20 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a   by (pKey,nKey).
33f30 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 20  ** and the data 
33f40 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44 61  is given by (pDa
33f50 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65 20  ta,nData).  The 
33f60 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20 6f  cursor is used o
33f70 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65  nly to.** define
33f80 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65 20   what table the 
33f90 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65  record should be
33fa0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e 20   inserted into. 
33fb0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
33fc0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
33fd0 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
33fe0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tion..**.** For 
33ff0 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c  an INTKEY table,
34000 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 76   only the nKey v
34010 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79 20  alue of the key 
34020 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 69  is used.  pKey i
34030 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46  s.** ignored.  F
34040 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74 61  or a ZERODATA ta
34050 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20 61  ble, the pData a
34060 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f 74  nd nData are bot
34070 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  h ignored..**.**
34080 20 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75   If the seekResu
34090 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
340a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
340b0 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
340c0 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
340d0 72 65 65 4d 6f 76 65 74 6f 28 29 20 74 6f 20 73  reeMoveto() to s
340e0 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75 72 20  eek cursor pCur 
340f0 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 20  to (pKey, nKey) 
34100 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
34110 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e 20 73  een performed. s
34120 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74 68 65  eekResult is the
34130 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 20 72   search result r
34140 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67 61 74  eturned (a negat
34150 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 69 66  ive.** number if
34160 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20   pCur points at 
34170 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 69 73  an entry that is
34180 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 28 70   smaller than (p
34190 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72 0a 2a  Key, nKey), or.*
341a0 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  * a positive val
341b0 75 65 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  ue if pCur point
341c0 73 20 61 74 20 61 6e 20 65 74 72 79 20 74 68 61  s at an etry tha
341d0 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
341e0 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b 65 79   .** (pKey, nKey
341f0 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  )). .**.** If th
34200 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70 61 72  e seekResult par
34210 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68 65  ameter is 0, the
34220 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20 6d 61  n cursor pCur ma
34230 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79 20 0a  y point to any .
34240 2a 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f 20 6e  ** entry or to n
34250 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c 2e 20  o entry at all. 
34260 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 69  In this case thi
34270 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 74  s function has t
34280 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20 63 75  o seek.** the cu
34290 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68 65 20  rsor before the 
342a0 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65 20 69  new key can be i
342b0 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
342c0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
342d0 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rt(.  BtCursor *
342e0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
342f0 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64       /* Insert d
34300 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62  ata into the tab
34310 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f  le of this curso
34320 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  r */.  const voi
34330 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
34340 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
34350 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f   of the new reco
34360 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
34370 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  id *pData, int n
34380 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61  Data,  /* The da
34390 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ta of the new re
343a0 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  cord */.  int nZ
343b0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
343c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
343d0 65 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79  er of extra 0 by
343e0 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f  tes to append to
343f0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61   data */.  int a
34400 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20 20 20  ppendBias,      
34410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
34420 65 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b  e if this is lik
34430 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f  ely an append */
34440 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73 75 6c  .  int seekResul
34450 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
34460 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 70    /* Result of p
34470 72 69 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  rior sqlite3Btre
34480 65 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c 20 2a  eMoveto() call *
34490 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
344a0 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65 6b 52   int loc = seekR
344b0 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73 7a 4e  esult;.  int szN
344c0 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  ew;.  int idx;. 
344d0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
344e0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
344f0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
34500 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
34510 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
34520 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a   char *oldCell;.
34530 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
34540 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20  *newCell = 0;.. 
34550 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
34560 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
34570 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
34580 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
34590 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
345a0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
345b0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73  readOnly );.  as
345c0 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c  sert( pCur->wrFl
345d0 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ag );.  assert( 
345e0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
345f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d  bleLock(p, pCur-
34600 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d  >pgnoRoot, pCur-
34610 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29  >pKeyInfo!=0, 2)
34620 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
34630 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74 20 69  s is an insert i
34640 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d 74 72  nto a table b-tr
34650 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  ee, invalidate a
34660 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20 20 2a  ny incrblob .  *
34670 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
34680 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20  n the row being 
34690 72 65 70 6c 61 63 65 64 20 28 61 73 73 75 6d 69  replaced (assumi
346a0 6e 67 20 74 68 69 73 20 69 73 20 61 20 72 65 70  ng this is a rep
346b0 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  lace.  ** operat
346c0 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73 20 6e  ion - if it is n
346d0 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ot, the followin
346e0 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e 20 20  g is a no-op).  
346f0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  */.  if( pCur->p
34700 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20  KeyInfo==0 ){.  
34710 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72    invalidateIncr
34720 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c 20 70  blobCursors(p, p
34730 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e  Cur->pgnoRoot, n
34740 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  Key, 0);.  }..  
34750 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
34760 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
34770 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
34780 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20  r->skip;.  }..  
34790 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
347a0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
347b0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
347c0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 0a 20  on this table.. 
347d0 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f 6d 65   **.  ** In some
347e0 20 63 61 73 65 73 2c 20 74 68 65 20 63 61 6c 6c   cases, the call
347f0 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
34800 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77 20 69  Moveto() below i
34810 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72 0a 20  s a no-op. For. 
34820 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77 68 65   ** example, whe
34830 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61 74 61  n inserting data
34840 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 77 69   into a table wi
34850 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61 74 65  th auto-generate
34860 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 6b  d integer.  ** k
34870 65 79 73 2c 20 74 68 65 20 56 44 42 45 20 6c 61  eys, the VDBE la
34880 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69  yer invokes sqli
34890 74 65 33 42 74 72 65 65 4c 61 73 74 28 29 20 74  te3BtreeLast() t
348a0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
348b0 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 6b   .  ** integer k
348c0 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20 74 68  ey to use. It th
348d0 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  en calls this fu
348e0 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75 61 6c  nction to actual
348f0 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20 0a 20  ly insert the . 
34900 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20 74 68   ** data into th
34910 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65 65 2e  e intkey B-Tree.
34920 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 73 71   In this case sq
34930 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
34940 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a 20 20  () recognizes.  
34950 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
34960 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 77 68  or is already wh
34970 65 72 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20  ere it needs to 
34980 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 77  be and returns w
34990 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f 69 6e  ithout.  ** doin
349a0 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f 20 61  g any work. To a
349b0 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67 20 74  void thwarting t
349c0 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
349d0 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74  ns, it is import
349e0 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20  ant.  ** not to 
349f0 63 6c 65 61 72 20 74 68 65 20 63 75 72 73 6f 72  clear the cursor
34a00 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   here..  */.  if
34a10 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21  (.    SQLITE_OK!
34a20 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75  =(rc = saveAllCu
34a30 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d  rsors(pBt, pCur-
34a40 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29  >pgnoRoot, pCur)
34a50 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a 20 20  ) || (!loc &&.  
34a60 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
34a70 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
34a80 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
34a90 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
34aa0 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 29 7b  as, &loc)).  )){
34ab0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
34ac0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
34ad0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
34ae0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 43 75  OR_VALID || (pCu
34af0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
34b00 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c 6f 63  R_INVALID && loc
34b10 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20  ) );..  pPage = 
34b20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
34b30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
34b40 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
34b50 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
34b60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
34b70 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
34b80 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52  ->intKey );.  TR
34b90 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
34ba0 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
34bb0 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
34bc0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
34bd0 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
34be0 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
34bf0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
34c00 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
34c10 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
34c20 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
34c30 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
34c40 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61  Init );.  alloca
34c50 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
34c60 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42  ;.  newCell = pB
34c70 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
34c80 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
34c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
34ca0 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
34cb0 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
34cc0 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
34cd0 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
34ce0 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29  , nZero, &szNew)
34cf0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
34d00 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
34d10 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63  assert( szNew==c
34d20 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
34d30 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20  , newCell) );.  
34d40 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d  assert( szNew<=M
34d50 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
34d60 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72   );.  idx = pCur
34d70 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
34d80 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d  age];.  if( loc=
34d90 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a  =0 ){.    u16 sz
34da0 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Old;.    assert(
34db0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
34dc0 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  l );.    rc = sq
34dd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34de0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
34df0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
34e00 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e       goto end_in
34e10 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sert;.    }.    
34e20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65  oldCell = findCe
34e30 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  ll(pPage, idx);.
34e40 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
34e50 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65  leaf ){.      me
34e60 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c  mcpy(newCell, ol
34e70 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d  dCell, 4);.    }
34e80 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c  .    szOld = cel
34e90 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
34ea0 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63  oldCell);.    rc
34eb0 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
34ec0 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20  ge, oldCell);.  
34ed0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34ee0 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20  end_insert;.    
34ef0 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
34f00 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29  age, idx, szOld)
34f10 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
34f20 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
34f30 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
34f40 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
34f50 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50   if( loc<0 && pP
34f60 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  age->nCell>0 ){.
34f70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
34f80 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69  e->leaf );.    i
34f90 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49  dx = ++pCur->aiI
34fa0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
34fb0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
34fc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
34fd0 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  f );.  }.  rc = 
34fe0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
34ff0 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20  , idx, newCell, 
35000 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20  szNew, 0, 0);.  
35010 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
35020 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 2d 3e  TE_OK || pPage->
35030 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61 67 65  nCell>0 || pPage
35040 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
35050 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65 72 72  ..  /* If no err
35060 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 61  or has occured a
35070 6e 64 20 70 50 61 67 65 20 68 61 73 20 61 6e 20  nd pPage has an 
35080 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c 20 63  overflow cell, c
35090 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20 0a 20  all balance() . 
350a0 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72 69 62   ** to redistrib
350b0 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20 77 69  ute the cells wi
350c0 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e 20 53  thin the tree. S
350d0 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29 20 6d  ince balance() m
350e0 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65  ay move.  ** the
350f0 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20 74 68   cursor, zero th
35100 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 2e  e BtCursor.info.
35110 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75 72 73  nSize and BtCurs
35120 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20 20 2a  or.validNKey.  *
35130 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a  * variables..  *
35140 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20  *.  ** Previous 
35150 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
35160 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65 54 6f  te called moveTo
35170 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65 20 74  Root() to move t
35180 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 62  he cursor.  ** b
35190 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f 74 20  ack to the root 
351a0 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63 65 28  page as balance(
351b0 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61 6c 69  ) used to invali
351c0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
351d0 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75 72 73  s.  ** of BtCurs
351e0 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  or.apPage[] and 
351f0 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 5b 5d  BtCursor.aiIdx[]
35200 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 6f 69  . Instead of doi
35210 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20 73 65  ng that,.  ** se
35220 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
35230 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64 22 2e  te to "invalid".
35240 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d 6d   This makes comm
35250 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  on insert operat
35260 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ions.  ** slight
35270 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a 2a 0a  ly faster..  **.
35280 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20    ** There is a 
35290 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70 6f 72  subtle but impor
352a0 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tant optimizatio
352b0 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68 65 6e  n here too. When
352c0 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a 2a 20   inserting.  ** 
352d0 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72 64 73  multiple records
352e0 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65 79 20   into an intkey 
352f0 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61 20 73  b-tree using a s
35300 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28 61 73  ingle cursor (as
35310 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70 65 6e   can.  ** happen
35320 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
35330 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54  g an "INSERT INT
35340 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20 73 74  O ... SELECT" st
35350 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20 20 2a  atement), it.  *
35360 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65 6f 75  * is advantageou
35370 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 63  s to leave the c
35380 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
35390 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
353a0 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74   in.  ** the b-t
353b0 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c 65 2e  ree if possible.
353c0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
353d0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
353e0 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  to the last.  **
353f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
35400 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e 65 78  ble, and the nex
35410 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64 20 68  t row inserted h
35420 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6b 65  as an integer ke
35430 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20 74 68  y.  ** larger th
35440 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 65  an the largest e
35450 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69 74 20  xisting key, it 
35460 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 69  is possible to i
35470 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a 20 72  nsert the.  ** r
35480 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65 6b 69  ow without seeki
35490 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e 20 54  ng the cursor. T
354a0 68 69 73 20 63 61 6e 20 62 65 20 61 20 62 69 67  his can be a big
354b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
354c0 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  st..  */.  pCur-
354d0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
354e0 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b  .  pCur->validNK
354f0 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  ey = 0;.  if( rc
35500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
35510 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
35520 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61  ){.    rc = bala
35530 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20 20 20  nce(pCur);..    
35540 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73 75 72  /* Must make sur
35550 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 72  e nOverflow is r
35560 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65 76 65  eset to zero eve
35570 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e 63 65  n if the balance
35580 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c 73 2e  ().    ** fails.
35590 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   Internal data s
355a0 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
355b0 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  ion will result 
355c0 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20 20 20  otherwise. .    
355d0 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74 68 65  ** Also, set the
355e0 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 74 6f   cursor state to
355f0 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73 20 73   invalid. This s
35600 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f 72 50  tops saveCursorP
35610 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20 2a 2a  osition().    **
35620 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20   from trying to 
35630 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  save the current
35640 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
35650 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20 20 20   cursor.  */.   
35660 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
35670 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
35680 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 70  rflow = 0;.    p
35690 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
356a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
356b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
356c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
356d0 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  Page]->nOverflow
356e0 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e 73 65  ==0 );..end_inse
356f0 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  rt:.  return rc;
35700 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
35710 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
35720 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
35730 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20  inting to.  The 
35740 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66  cursor.** is lef
35750 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20  t pointing at a 
35760 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61 74 69  arbitrary locati
35770 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
35780 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74  e3BtreeDelete(Bt
35790 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
357a0 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
357b0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
357c0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
357d0 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
357e0 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20   .  int rc;     
357f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35800 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35810 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d  rn code */.  Mem
35820 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
35830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35840 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64 65 6c    /* Page to del
35850 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20 2a 2f  ete cell from */
35860 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
35870 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
35880 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
35890 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20 64 65  er to cell to de
358a0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 43  lete */.  int iC
358b0 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20 20 20  ellIdx;         
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
358d0 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c 6c 20  * Index of cell 
358e0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
358f0 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b 20 20  nt iCellDepth;  
35900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35910 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f 66 20      /* Depth of 
35920 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  node containing 
35930 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61 73 73  pCell */ ..  ass
35940 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
35950 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
35960 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
35970 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
35980 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
35990 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
359a0 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65 72 74  Only );.  assert
359b0 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
359c0 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  ;.  assert( hasS
359d0 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
359e0 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e  ock(p, pCur->pgn
359f0 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70 4b 65  oRoot, pCur->pKe
35a00 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29 3b 0a  yInfo!=0, 2) );.
35a10 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65    assert( !hasRe
35a20 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 70  adConflicts(p, p
35a30 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29 20 29  Cur->pgnoRoot) )
35a40 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  ;..  if( NEVER(p
35a50 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
35a60 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61  >iPage]>=pCur->a
35a70 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
35a80 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20 20 7c  e]->nCell) .   |
35a90 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  | NEVER(pCur->eS
35aa0 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
35ab0 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ID).  ){.    ret
35ac0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
35ad0 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20  ;  /* Something 
35ae0 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e 20 2a  has gone awry. *
35af0 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  /.  }..  /* If t
35b00 68 69 73 20 69 73 20 61 20 64 65 6c 65 74 65 20  his is a delete 
35b10 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72 65 6d  operation to rem
35b20 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d 20 61  ove a row from a
35b30 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 0a 20   table b-tree,. 
35b40 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 20 61   ** invalidate a
35b50 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
35b60 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
35b70 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65 74 65  row being delete
35b80 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  d.  */.  if( pCu
35b90 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29  r->pKeyInfo==0 )
35ba0 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
35bb0 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
35bc0 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  p, pCur->pgnoRoo
35bd0 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  t, pCur->info.nK
35be0 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69  ey, 0);.  }..  i
35bf0 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43 75 72  CellDepth = pCur
35c00 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65 6c 6c  ->iPage;.  iCell
35c10 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  Idx = pCur->aiId
35c20 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b 0a 20  x[iCellDepth];. 
35c30 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
35c40 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70 74 68  pPage[iCellDepth
35c50 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  ];.  pCell = fin
35c60 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
35c70 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20 49 66  llIdx);..  /* If
35c80 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
35c90 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79 20 74  ning the entry t
35ca0 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74 20  o delete is not 
35cb0 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d 6f 76  a leaf page, mov
35cc0 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f  e.  ** the curso
35cd0 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73 74  r to the largest
35ce0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72   entry in the tr
35cf0 65 65 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  ee that is small
35d00 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74 68 65  er than.  ** the
35d10 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64 65 6c   entry being del
35d20 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c 6c 20  eted. This cell 
35d30 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74 68 65  will replace the
35d40 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
35d50 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68  ted.  ** from th
35d60 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 2e  e internal node.
35d70 20 54 68 65 20 27 70 72 65 76 69 6f 75 73 27 20   The 'previous' 
35d80 65 6e 74 72 79 20 69 73 20 75 73 65 64 20 66 6f  entry is used fo
35d90 72 20 74 68 69 73 20 69 6e 73 74 65 61 64 0a 20  r this instead. 
35da0 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65 78 74   ** of the 'next
35db0 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68 65 20  ' entry, as the 
35dc0 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69  previous entry i
35dd0 73 20 61 6c 77 61 79 73 20 61 20 70 61 72 74 20  s always a part 
35de0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75 62 2d  of the.  ** sub-
35df0 74 72 65 65 20 68 65 61 64 65 64 20 62 79 20 74  tree headed by t
35e00 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  he child page of
35e10 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20   the cell being 
35e20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20 6d 61  deleted. This ma
35e30 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69  kes.  ** balanci
35e40 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f 6c 6c  ng the tree foll
35e50 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65 74 65  owing the delete
35e60 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73 69 65   operation easie
35e70 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  r.  */.  if( !pP
35e80 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
35e90 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20   int notUsed;.  
35ea0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
35eb0 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74  =(rc = sqlite3Bt
35ec0 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
35ed0 2c 20 26 6e 6f 74 55 73 65 64 29 29 20 29 7b 0a  , &notUsed)) ){.
35ee0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
35ef0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
35f00 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69   Save the positi
35f10 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72  ons of any other
35f20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
35f30 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 66 6f   this table befo
35f40 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67 20 61  re.  ** making a
35f50 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73  ny modifications
35f60 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67 65 20  . Make the page 
35f70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
35f80 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20 2a 2a  ntry to be .  **
35f90 20 64 65 6c 65 74 65 64 20 77 72 69 74 61 62 6c   deleted writabl
35fa0 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61 6e 79  e. Then free any
35fb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
35fc0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35fd0 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72 79 20  the .  ** entry 
35fe0 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65 6d 6f  and finally remo
35ff0 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74 73 65  ve the cell itse
36000 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  lf from within t
36010 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69  he page.  */.  i
36020 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
36030 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  c = saveAllCurso
36040 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  rs(pBt, pCur->pg
36050 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 0a 20  noRoot, pCur)). 
36060 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
36070 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
36080 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
36090 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20 53  DbPage)).   || S
360a0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
360b0 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c  clearCell(pPage,
360c0 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c 7c 20 53   pCell)).   || S
360d0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
360e0 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20  dropCell(pPage, 
360f0 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c 53 69  iCellIdx, cellSi
36100 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
36110 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  ll))).  ){.    r
36120 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
36130 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
36140 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f 74 20  deleted was not 
36150 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c 65 61  located on a lea
36160 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  f page, then the
36170 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69 73 20   cursor.  ** is 
36180 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
36190 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67 65 73  ng to the larges
361a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 73  t entry in the s
361b0 75 62 2d 74 72 65 65 20 68 65 61 64 65 64 0a 20  ub-tree headed. 
361c0 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69 6c 64   ** by the child
361d0 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63 65 6c  -page of the cel
361e0 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  l that was just 
361f0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 6e 20  deleted from an 
36200 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f  internal.  ** no
36210 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66 72 6f  de. The cell fro
36220 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  m the leaf node 
36230 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f 76 65  needs to be move
36240 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
36250 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f 20 72  l.  ** node to r
36260 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c 65 74  eplace the delet
36270 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20 20 69  ed cell.  */.  i
36280 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
36290 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
362a0 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 61 70  pLeaf = pCur->ap
362b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
362c0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  ];.    int nCell
362d0 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d 20 70  ;.    Pgno n = p
362e0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c  Cur->apPage[iCel
362f0 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e 6f 3b  lDepth+1]->pgno;
36300 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
36310 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20 20 70  ar *pTmp;..    p
36320 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
36330 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43  pLeaf, pLeaf->nC
36340 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43 65 6c  ell-1);.    nCel
36350 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  l = cellSizePtr(
36360 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b 0a 20  pLeaf, pCell);. 
36370 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45     assert( MX_CE
36380 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 6e 43  LL_SIZE(pBt)>=nC
36390 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c 6c 6f  ell );..    allo
363a0 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
363b0 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d 20 70  t);.    pTmp = p
363c0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 0a  Bt->pTmpSpace;..
363d0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
363e0 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
363f0 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
36400 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20 20 20  ->pDbPage)) .   
36410 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    || SQLITE_OK!=
36420 28 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c  (rc = insertCell
36430 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49 64 78  (pPage, iCellIdx
36440 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65 6c 6c  , pCell-4, nCell
36450 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29 0a 20 20  +4, pTmp, n)).  
36460 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21     || SQLITE_OK!
36470 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28  =(rc = dropCell(
36480 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e 6e 43  pLeaf, pLeaf->nC
36490 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29 0a 20  ell-1, nCell)). 
364a0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
364b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
364c0 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65 20 74  ..  /* Balance t
364d0 68 65 20 74 72 65 65 2e 20 49 66 20 74 68 65 20  he tree. If the 
364e0 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20 77 61  entry deleted wa
364f0 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c  s located on a l
36500 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a 20 74  eaf page,.  ** t
36510 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 73  hen the cursor s
36520 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74  till points to t
36530 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74 68 69  hat page. In thi
36540 73 20 63 61 73 65 20 74 68 65 20 66 69 72 73 74  s case the first
36550 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 61  .  ** call to ba
36560 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72 73 20  lance() repairs 
36570 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20 74 68  the tree, and th
36580 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64 69 74  e if(...) condit
36590 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65 76 65  ion is.  ** neve
365a0 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20 20 2a  r true..  **.  *
365b0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
365c0 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65  the entry delete
365d0 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e 74 65  d was on an inte
365e0 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65 2c 20  rnal node page, 
365f0 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72 20 69  then.  ** pCur i
36600 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
36610 65 20 6c 65 61 66 20 70 61 67 65 20 66 72 6f 6d  e leaf page from
36620 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20 77 61   which a cell wa
36630 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20 20 2a  s removed to.  *
36640 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20 63 65  * replace the ce
36650 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  ll deleted from 
36660 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
36670 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68  e. This is sligh
36680 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b 79 20  tly.  ** tricky 
36690 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  as the leaf node
366a0 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66 75 6c   may be underful
366b0 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74 65 72  l, and the inter
366c0 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20 20 2a  nal node may.  *
366d0 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e 64 65  * be either unde
366e0 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e 20 49  r or overfull. I
366f0 6e 20 74 68 69 73 20 63 61 73 65 20 72 75 6e 20  n this case run 
36700 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 61 6c  the balancing al
36710 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f 6e 20  gorithm.  ** on 
36720 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 66 69  the leaf node fi
36730 72 73 74 2e 20 49 66 20 74 68 65 20 62 61 6c 61  rst. If the bala
36740 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66 61 72  nce proceeds far
36750 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65 0a 20   enough up the. 
36760 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20 77 65   ** tree that we
36770 20 63 61 6e 20 62 65 20 73 75 72 65 20 74 68 61   can be sure tha
36780 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20 69 6e  t any problem in
36790 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   the internal no
367a0 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  de has.  ** been
367b0 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f 20 62   corrected, so b
367c0 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  e it. Otherwise,
367d0 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67   after balancing
367e0 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 2c 0a   the leaf node,.
367f0 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20 63 75    ** walk the cu
36800 72 73 6f 72 20 75 70 20 74 68 65 20 74 72 65 65  rsor up the tree
36810 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
36820 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61 6e 63   node and balanc
36830 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20 77 65  e it as .  ** we
36840 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 62  ll.  */.  rc = b
36850 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 20 20  alance(pCur);.  
36860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36870 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65  K && pCur->iPage
36880 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b 0a 20  >iCellDepth ){. 
36890 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
368a0 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
368b0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
368c0 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
368d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
368e0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ]);.    }.    rc
368f0 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29   = balance(pCur)
36900 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
36910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36920 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75    moveToRoot(pCu
36930 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
36940 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
36950 65 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65  eate a new BTree
36960 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69   table.  Write i
36970 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65  nto *piTable the
36980 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
36990 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
369a0 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  e of the new tab
369b0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79  le..**.** The ty
369c0 70 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65  pe of type is de
369d0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
369e0 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e  flags parameter.
369f0 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f    Only the.** fo
36a00 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f  llowing values o
36a10 66 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72  f flags are curr
36a20 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f  ently in use.  O
36a30 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a  ther values for.
36a40 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e  ** flags might n
36a50 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20  ot work:.**.**  
36a60 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c     BTREE_INTKEY|
36a70 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20  BTREE_LEAFDATA  
36a80 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
36a90 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69  tables with rowi
36aa0 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54  d keys.**     BT
36ab0 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20  REE_ZERODATA    
36ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73                Us
36ad0 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63  ed for SQL indic
36ae0 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
36af0 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
36b00 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
36b10 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c  *piTable, int fl
36b20 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ags){.  BtShared
36b30 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
36b40 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74    MemPage *pRoot
36b50 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f  ;.  Pgno pgnoRoo
36b60 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
36b70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
36b80 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
36b90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
36ba0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
36bb0 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
36bc0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
36bd0 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
36be0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
36bf0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
36c00 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
36c10 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
36c20 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
36c30 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
36c40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
36c50 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
36c60 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36c70 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
36c80 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
36c90 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
36ca0 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
36cb0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
36cc0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
36cd0 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
36ce0 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
36cf0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
36d00 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
36d10 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
36d20 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
36d30 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
36d40 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
36d50 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
36d60 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
36d70 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
36d80 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
36d90 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
36da0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
36db0 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
36dc0 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
36dd0 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
36de0 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
36df0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
36e00 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
36e10 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
36e20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
36e30 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
36e40 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
36e50 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
36e60 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
36e70 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
36e80 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
36e90 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
36ea0 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
36eb0 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
36ec0 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
36ed0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
36ee0 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
36ef0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
36f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
36f10 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41  Meta(p, BTREE_LA
36f20 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c  RGEST_ROOT_PAGE,
36f30 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
36f40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
36f50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
36f60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
36f70 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
36f80 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
36f90 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
36fa0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
36fb0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
36fc0 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
36fd0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
36fe0 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
36ff0 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
37000 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
37010 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
37020 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
37030 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37040 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
37050 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
37060 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37070 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
37080 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
37090 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
370a0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
370b0 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
370c0 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
370d0 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
370e0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
370f0 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
37100 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
37110 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
37120 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
37130 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
37140 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37150 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
37160 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
37170 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
37180 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37190 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
371a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
371b0 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
371c0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
371d0 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
371e0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
371f0 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
37200 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
37210 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
37220 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
37230 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
37240 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
37250 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
37260 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
37270 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
37280 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
37290 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
372a0 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
372b0 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
372c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
372d0 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
372e0 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
372f0 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
37300 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
37310 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
37320 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
37330 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
37340 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
37350 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
37360 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
37370 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
37380 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
37390 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
373a0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
373b0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
373c0 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
373d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
373e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
373f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
37400 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
37410 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
37420 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
37430 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37440 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
37450 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65  OOTPAGE || eType
37460 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
37470 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
37480 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
37490 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
374a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
374b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
374c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
374d0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
374e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
374f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
37500 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
37510 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
37520 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
37530 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
37540 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
37550 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
37560 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
37570 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20  Page, pgnoMove, 
37580 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  0);.      releas
37590 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
375a0 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
375b0 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
375c0 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
375d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
375e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
375f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37600 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
37610 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
37620 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
37630 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
37640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37650 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37660 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37680 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
37690 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
376a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
376b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
376c0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
376d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
376e0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
376f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
37700 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
37710 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
37720 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
37730 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
37740 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
37750 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
37760 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
37770 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
37780 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
37790 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
377a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
377b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
377c0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
377d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
377e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
377f0 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
37800 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
37810 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37820 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
37830 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
37840 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
37850 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
37860 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
37870 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
37880 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
37890 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
378a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
378b0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
378c0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
378d0 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
378e0 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
378f0 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
37900 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
37910 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37920 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
37930 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
37940 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
37950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37960 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
37970 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
37980 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
37990 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
379a0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
379b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
379c0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
379d0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
379e0 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
379f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37a00 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
37a10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37a20 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
37a30 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
37a40 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
37a50 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
37a60 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
37a70 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
37a80 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
37a90 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
37aa0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
37ab0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
37ac0 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
37ad0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
37ae0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
37af0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
37b00 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
37b10 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
37b20 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag,     /* Deal
37b30 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
37b40 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rue */.  int *pn
37b50 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50  Change.){.  MemP
37b60 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
37b70 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
37b80 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
37b90 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
37ba0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37bb0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
37bc0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
37bd0 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
37be0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  t(pBt) ){.    re
37bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
37c00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
37c10 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
37c20 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
37c30 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
37c40 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
37c50 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
37c60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
37c70 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
37c80 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
37c90 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
37ca0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
37cb0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
37cc0 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
37cd0 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
37ce0 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70  yte(pCell), 1, p
37cf0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
37d00 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
37d10 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
37d20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
37d30 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
37d40 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
37d50 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
37d60 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
37d70 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
37d80 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
37d90 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
37da0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
37db0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
37dc0 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70  >aData[8]), 1, p
37dd0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66  nChange);.    if
37de0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
37df0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
37e00 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
37e10 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61  nChange ){.    a
37e20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
37e30 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43  tKey );.    *pnC
37e40 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e  hange += pPage->
37e50 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28  nCell;.  }.  if(
37e60 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
37e70 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
37e80 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
37e90 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
37ea0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
37eb0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
37ec0 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
37ed0 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
37ee0 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
37ef0 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
37f00 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
37f10 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
37f20 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
37f30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
37f40 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
37f50 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
37f60 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
37f70 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
37f80 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67  le is.** the pag
37f90 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
37fa0 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
37fb0 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  e.  After this r
37fc0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a  outine returns,.
37fd0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
37fe0 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73   is empty, but s
37ff0 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  till exists..**.
38000 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
38010 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
38020 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
38030 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
38040 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f  en.** read curso
38050 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
38060 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72    Open write cur
38070 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74  sors are moved t
38080 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66  o the.** root of
38090 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
380a0 2a 20 49 66 20 70 6e 43 68 61 6e 67 65 20 69 73  * If pnChange is
380b0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
380c0 74 61 62 6c 65 20 69 54 61 62 6c 65 20 6d 75 73  table iTable mus
380d0 74 20 62 65 20 61 6e 20 69 6e 74 6b 65 79 20 74  t be an intkey t
380e0 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74  able. The.** int
380f0 65 67 65 72 20 76 61 6c 75 65 20 70 6f 69 6e 74  eger value point
38100 65 64 20 74 6f 20 62 79 20 70 6e 43 68 61 6e 67  ed to by pnChang
38110 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
38120 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   by the number o
38130 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20 69 6e 20  f.** entries in 
38140 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  the table..*/.in
38150 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
38160 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20 2a  earTable(Btree *
38170 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
38180 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20  nt *pnChange){. 
38190 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
381a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
381b0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
381c0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
381d0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
381e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
381f0 0a 20 20 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65  .  /* Invalidate
38200 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 20 63 75   all incrblob cu
38210 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 61  rsors open on ta
38220 62 6c 65 20 69 54 61 62 6c 65 20 28 61 73 73 75  ble iTable (assu
38230 6d 69 6e 67 20 69 54 61 62 6c 65 0a 20 20 2a 2a  ming iTable.  **
38240 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
38250 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 2d  a table b-tree -
38260 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   if it is not, t
38270 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
38280 6c 20 69 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f  l is.  ** a no-o
38290 70 29 2e 20 20 2a 2f 0a 20 20 69 6e 76 61 6c 69  p).  */.  invali
382a0 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
382b0 6f 72 73 28 70 2c 20 69 54 61 62 6c 65 2c 20 30  ors(p, iTable, 0
382c0 2c 20 31 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c  , 1);..  if( SQL
382d0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 61  ITE_OK==(rc = sa
382e0 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
382f0 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20  , (Pgno)iTable, 
38300 30 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  0)) ){.    rc = 
38310 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
38320 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
38330 62 6c 65 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65  ble, 0, pnChange
38340 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
38350 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
38360 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
38370 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20 69  *.** Erase all i
38380 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61 20  nformation in a 
38390 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74 68  table and add th
383a0 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61  e root of the ta
383b0 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66 72  ble to.** the fr
383c0 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74 2c  eelist.  Except,
383d0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
383e0 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c 65   principle table
383f0 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20   (the one on.** 
38400 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65 72  page 1) is never
38410 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
38420 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  eelist..**.** Th
38430 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
38440 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
38450 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
38460 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
38470 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
38480 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
38490 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65 6e  AUTOVACUUM is en
384a0 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70 61  abled and the pa
384b0 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73 20  ge at iTable is 
384c0 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  not the last.** 
384d0 72 6f 6f 7