/ Hex Artifact Content
Login

Artifact 8a3f74aeea07833a7dd62ccd60c5486a17b2044c:


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 39 20 32 30 30 39 2f 30  c,v 1.649 2009/0
0190: 37 2f 30 32 20 31 37 3a 32 31 3a 35 38 20 64 61  7/02 17:21:58 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69  ;.}.#endif....#i
07c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
07d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
07e0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
07f0: 74 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65  tions queryShare
0800: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0810: 29 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ), setSharedCach
0820: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20  eTableLock(),.  
0830: 2a 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53  ** and clearAllS
0840: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0850: 6f 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  ocks().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61  #define querySha
09c0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
09d0: 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  k(a,b,c) SQLITE_
09e0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74  OK.  #define set
09f0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a00: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0a10: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0a20: 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
0a30: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29  cheTableLocks(a)
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67  .  #define downg
0a50: 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
0a60: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a70: 20 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61    #define hasSha
0a80: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0a90: 6b 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23  k(a,b,c,d) 1.  #
0aa0: 64 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f  define hasReadCo
0ab0: 6e 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a  nflicts(a, b) 0.
0ac0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0ae0: 45 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66  ED_CACHE..#ifdef
0af0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
0b00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
0b10: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0b20: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0b30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0b40: 20 49 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68   It checks.** th
0b50: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  at connection p 
0b60: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
0b70: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
0b80: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
0b90: 20 0a 2a 2a 20 62 2d 74 72 65 65 20 77 69 74 68   .** b-tree with
0ba0: 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74   root page iRoot
0bb0: 2e 20 49 66 20 73 6f 2c 20 74 72 75 65 20 69 73  . If so, true is
0bc0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
0bd0: 77 69 73 65 2c 20 66 61 6c 73 65 2e 20 0a 2a 2a  wise, false. .**
0be0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   For example, wh
0bf0: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  en writing to a 
0c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 69 74  table b-tree wit
0c10: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
0c20: 74 20 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20  t via .** Btree 
0c30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65  connection pBtre
0c40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65  e:.**.**    asse
0c50: 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
0c60: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72  heTableLock(pBtr
0c70: 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52  ee, iRoot, 0, WR
0c80: 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a  ITE_LOCK) );.**.
0c90: 2a 2a 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20  ** When writing 
0ca0: 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
0cb0: 65 65 20 74 68 61 74 20 72 65 73 69 64 65 73 20  ee that resides 
0cc0: 69 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61  in a sharable da
0cd0: 74 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20  tabase, the .** 
0ce0: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61  caller should ha
0cf0: 76 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65  ve first obtaine
0d00: 64 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79  d a lock specify
0d10: 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ing the root pag
0d20: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72  e of.** the corr
0d30: 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
0d40: 62 2d 74 72 65 65 2e 20 54 68 69 73 20 6d 61 6b  b-tree. This mak
0d50: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
0d60: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
0d70: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
0d80: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
0d90: 62 2d 74 72 65 65 20 61 73 20 61 20 73 65 70 61  b-tree as a sepa
0da0: 72 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20  rate structure. 
0db0: 54 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  To determine.** 
0dc0: 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  the table b-tree
0dd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0de0: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  o the index b-tr
0df0: 65 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ee being written
0e00: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0e10: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0e20: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0e30: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0e40: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0e50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 62 2d 74   lock on the b-t
0e60: 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ree rooted at pa
0e70: 67 65 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61  ge iRoot, the ca
0e80: 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64  ller may.** hold
0e90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
0ea0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
0eb0: 65 20 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e  e (root page 1).
0ec0: 20 54 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a   This is also.**
0ed0: 20 61 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a   acceptable..*/.
0ee0: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 53 68  static int hasSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ck(.  Btree *pBt
0f10: 72 65 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ree,         /* 
0f20: 48 61 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74  Handle that must
0f30: 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   hold lock */.  
0f40: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
0f50: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
0f60: 61 67 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f  age of b-tree */
0f70: 0a 20 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20  .  int isIndex, 
0f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0f90: 65 20 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68  e if iRoot is th
0fa0: 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64  e root of an ind
0fb0: 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  ex b-tree */.  i
0fc0: 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20  nt eLockType    
0fd0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
0fe0: 64 20 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41  d lock type (REA
0ff0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1000: 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63  LOCK) */.){.  Sc
1010: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
1020: 28 53 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65  (Schema *)pBtree
1030: 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  ->pBt->pSchema;.
1040: 20 20 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b    Pgno iTab = 0;
1050: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
1060: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1070: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
1080: 69 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65  is not shareable
1090: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65  , or if the clie
10a0: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20  nt is reading.  
10b0: 2a 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72  ** and has the r
10c0: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
10d0: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e  flag set, then n
10e0: 6f 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72  o lock is requir
10f0: 65 64 2e 20 0a 20 20 2a 2a 20 49 6e 20 74 68 65  ed. .  ** In the
1100: 73 65 20 63 61 73 65 73 20 72 65 74 75 72 6e 20  se cases return 
1110: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1120: 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  .  If the client
1130: 20 69 73 20 72 65 61 64 69 6e 67 20 0a 20 20 2a   is reading .  *
1140: 2a 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20  * or writing an 
1150: 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75  index b-tree, bu
1160: 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  t the schema is 
1170: 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65 6e  not loaded, then
1180: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   return.  ** tru
1190: 65 20 61 6c 73 6f 2e 20 49 6e 20 74 68 69 73 20  e also. In this 
11a0: 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 69 73  case the lock is
11b0: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 69   required, but i
11c0: 74 20 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75  t is too difficu
11d0: 6c 74 0a 20 20 2a 2a 20 74 6f 20 63 68 65 63 6b  lt.  ** to check
11e0: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 61   if the client a
11f0: 63 74 75 61 6c 6c 79 20 68 6f 6c 64 73 20 69 74  ctually holds it
1200: 2e 20 54 68 69 73 20 64 6f 65 73 6e 27 74 20 68  . This doesn't h
1210: 61 70 70 65 6e 20 76 65 72 79 0a 20 20 2a 2a 20  appen very.  ** 
1220: 6f 66 74 65 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  often.  */.  if(
1230: 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61 62   (pBtree->sharab
1240: 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65 4c  le==0).   || (eL
1250: 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c 4f  ockType==READ_LO
1260: 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e 64  CK && (pBtree->d
1270: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1280: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
1290: 64 29 29 0a 20 20 20 7c 7c 20 28 69 73 49 6e 64  d)).   || (isInd
12a0: 65 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20  ex && (!pSchema 
12b0: 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 66 6c 61  || (pSchema->fla
12c0: 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  gs&DB_SchemaLoad
12d0: 65 64 29 3d 3d 30 20 29 29 0a 20 20 29 7b 0a 20  ed)==0 )).  ){. 
12e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12f0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1300: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1310: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1320: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1330: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1340: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
1350: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1360: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1370: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1380: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1390: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
13a0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13b0: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
13c0: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
13d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
13e0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
13f0: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1400: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1410: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1420: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1430: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1440: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
1450: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1460: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1470: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1480: 74 6e 75 6d 3d 3d 69 52 6f 6f 74 20 29 7b 0a 09  tnum==iRoot ){..
1490: 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  iTab = pIdx->pTa
14a0: 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  ble->tnum;.     
14b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14c0: 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f  {.    iTab = iRo
14d0: 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ot;.  }..  /* Se
14e0: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 65 71  arch for the req
14f0: 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68  uired lock. Eith
1500: 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  er a write-lock 
1510: 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  on root-page iTa
1520: 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65  b, a .  ** write
1530: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
1540: 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20 28 69  ema table, or (i
1550: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
1560: 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20  reading) a.  ** 
1570: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61  read-lock on iTa
1580: 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 20  b will suffice. 
1590: 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 79 20  Return 1 if any 
15a0: 6f 66 20 74 68 65 73 65 20 61 72 65 20 66 6f 75  of these are fou
15b0: 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c  nd.  */.  for(pL
15c0: 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  ock=pBtree->pBt-
15d0: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
15e0: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
15f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  t){.    if( pLoc
1600: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 72 65  k->pBtree==pBtre
1610: 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c 6f 63  e .     && (pLoc
1620: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  k->iTable==iTab 
1630: 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  || (pLock->eLock
1640: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20  ==WRITE_LOCK && 
1650: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31  pLock->iTable==1
1660: 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f 63 6b  )).     && pLock
1670: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79  ->eLock>=eLockTy
1680: 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pe .    ){.     
1690: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65  .  }..  /* Faile
16b0: 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65  d to find the re
16c0: 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  quired lock. */.
16d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16f0: 6f 6e 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  on is also used 
1700: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1710: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  t() statements o
1720: 6e 6c 79 2e 20 49 74 20 0a 2a 2a 20 72 65 74 75  nly. It .** retu
1730: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 72  rns true if ther
1740: 65 20 65 78 69 73 74 20 6f 6e 65 20 6f 72 20 6d  e exist one or m
1750: 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ore cursors open
1760: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   on the table .*
1770: 2a 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  * with root page
1780: 20 69 52 6f 6f 74 20 74 68 61 74 20 64 6f 20 6e   iRoot that do n
1790: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 65 69 74  ot belong to eit
17a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  her connection p
17b0: 42 74 72 65 65 20 0a 2a 2a 20 6f 72 20 73 6f 6d  Btree .** or som
17c0: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
17d0: 6f 6e 20 74 68 61 74 20 68 61 73 20 74 68 65 20  on that has the 
17e0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
17f0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
1800: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1810: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1820: 70 61 67 65 20 69 52 6f 6f 74 3a 0a 2a 2a 0a 2a  page iRoot:.**.*
1830: 2a 20 20 20 20 61 73 73 65 72 74 28 20 21 68 61  *    assert( !ha
1840: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1850: 42 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b  Btree, iRoot) );
1860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
1870: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1880: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50  Btree *pBtree, P
1890: 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74  gno iRoot){.  Bt
18a0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
18b0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
18c0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18e0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
18f0: 6f 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e  oot .     && p->
1900: 70 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20  pBtree!=pBtree. 
1910: 20 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42      && 0==(p->pB
1920: 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  tree->db->flags 
1930: 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
1940: 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b  ommitted).    ){
1950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1970: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1980: 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
1990: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
19a0: 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65  .** Query to see
19b0: 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65   if btree handle
19c0: 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20   p may obtain a 
19d0: 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f  lock of type eLo
19e0: 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43  ck .** (READ_LOC
19f0: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1a00: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1a10: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1a20: 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  b. Return.** SQL
1a30: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f  ITE_OK if the lo
1a40: 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ck may be obtain
1a50: 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a  ed (by calling.*
1a60: 2a 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  * setSharedCache
1a70: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72  TableLock()), or
1a80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
1a90: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1aa0: 20 69 6e 74 20 71 75 65 72 79 53 68 61 72 65 64   int queryShared
1ab0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
1ac0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
1ad0: 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  ab, u8 eLock){. 
1ae0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1af0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1b00: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1b10: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1b20: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
1b40: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
1b50: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1b60: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
1b70: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a 20 20  ->db!=0 );.  .  
1b80: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
1b90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
1ba0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
1bb0: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
1bc0: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
1bd0: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
1be0: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
1bf0: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
1c00: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
1c10: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
1c20: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1c30: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
1c40: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
1c50: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1c60: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
1c70: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
1c80: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1c90: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
1ca0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1cb0: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
1cc0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1cd0: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
1ce0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1cf0: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1d00: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1d10: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1d20: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
1d30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d40: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1d50: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
1d60: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1d70: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
1d80: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
1d90: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
1da0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
1db0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
1dc0: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
1dd0: 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73  && pBt->isExclus
1de0: 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ive ){.    sqlit
1df0: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1e00: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
1e10: 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20  pWriter->db);.  
1e20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e30: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1e40: 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  HE;.  }..  /* Th
1e50: 69 73 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 73  is (along with s
1e60: 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62  etSharedCacheTab
1e70: 6c 65 4c 6f 63 6b 28 29 29 20 69 73 20 77 68 65  leLock()) is whe
1e80: 72 65 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64  re.  ** the Read
1e90: 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
1ea0: 20 69 73 20 64 65 61 6c 74 20 77 69 74 68 2e 0a   is dealt with..
1eb0: 20 20 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c    ** If the call
1ec0: 65 72 20 69 73 20 71 75 65 72 79 69 6e 67 20 66  er is querying f
1ed0: 6f 72 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f  or a read-lock o
1ee0: 6e 20 61 6e 79 20 74 61 62 6c 65 0a 20 20 2a 2a  n any table.  **
1ef0: 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20   other than the 
1f00: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1f10: 62 6c 65 20 28 74 61 62 6c 65 20 31 29 20 61 6e  ble (table 1) an
1f20: 64 20 69 66 20 74 68 65 20 52 65 61 64 55 6e 63  d if the ReadUnc
1f30: 6f 6d 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 6c  ommitted.  ** fl
1f40: 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
1f50: 74 68 65 20 6c 6f 63 6b 20 67 72 61 6e 74 65 64  the lock granted
1f60: 20 65 76 65 6e 20 69 66 20 74 68 65 72 65 20 61   even if there a
1f70: 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20  re write-locks. 
1f80: 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65   ** on the table
1f90: 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63  . If a write-loc
1fa0: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
1fb0: 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74  the ReadUncommit
1fc0: 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  ted flag.  ** is
1fd0: 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e   not considered.
1fe0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75  .  **.  ** In fu
1ff0: 6e 63 74 69 6f 6e 20 73 65 74 53 68 61 72 65 64  nction setShared
2000: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
2010: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
2020: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
2030: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
2040: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
2050: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
2060: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
2070: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
2080: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
2090: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
20a0: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
20b0: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
20c0: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
20d0: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
20e0: 73 0a 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d 73 63  s.  ** on non-sc
20f0: 68 65 6d 61 20 74 61 62 6c 65 73 20 64 6f 20 6e  hema tables do n
2100: 6f 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73  ot create or res
2110: 70 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73  pect table locks
2120: 2e 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  . The locking.  
2130: 2a 2a 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72  ** procedure for
2140: 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
2150: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e  does not change.
2160: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
2170: 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67   0==(p->db->flag
2180: 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  s&SQLITE_ReadUnc
2190: 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20  ommitted) || .  
21a0: 20 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c    eLock==WRITE_L
21b0: 4f 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d  OCK ||.    iTab=
21c0: 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29  =MASTER_ROOT.  )
21d0: 7b 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d  {.    for(pIter=
21e0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65  pBt->pLock; pIte
21f0: 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e  r; pIter=pIter->
2200: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 2f 2a  pNext){.      /*
2210: 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 28   The condition (
2220: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c  pIter->eLock!=eL
2230: 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ock) in the foll
2240: 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a 20  owing if(...) . 
2250: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
2260: 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63  t is a simplific
2270: 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 20 20  ation of:.      
2280: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 65  **.      **   (e
2290: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
22a0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
22b0: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20  ==WRITE_LOCK).  
22c0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22d0: 73 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68  since we know th
22e0: 61 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49  at if eLock==WRI
22f0: 54 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f  TE_LOCK, then no
2300: 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
2310: 6e 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 68  n.      ** may h
2320: 6f 6c 64 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b  old a WRITE_LOCK
2330: 20 6f 6e 20 61 6e 79 20 74 61 62 6c 65 20 69 6e   on any table in
2340: 20 74 68 69 73 20 66 69 6c 65 20 28 73 69 6e 63   this file (sinc
2350: 65 20 74 68 65 72 65 20 63 61 6e 0a 20 20 20 20  e there can.    
2360: 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20 61 20 73    ** only be a s
2370: 69 6e 67 6c 65 20 77 72 69 74 65 72 29 2e 0a 20  ingle writer).. 
2380: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
2390: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f  sert( pIter->eLo
23a0: 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c  ck==READ_LOCK ||
23b0: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
23c0: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  RITE_LOCK );.   
23d0: 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b     assert( eLock
23e0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
23f0: 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Iter->pBtree==p 
2400: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2410: 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  =READ_LOCK);.   
2420: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
2430: 74 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72  tree!=p && pIter
2440: 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26  ->iTable==iTab &
2450: 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d  & pIter->eLock!=
2460: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  eLock ){.       
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e   pIter->pBtree->
24a0: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  db);.        if(
24b0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
24c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CK ){.          
24d0: 61 73 73 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e  assert( p==pBt->
24e0: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
24f0: 20 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64       pBt->isPend
2500: 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ing = 1;.       
2510: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
2520: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  n SQLITE_LOCKED_
2530: 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
2540: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2550: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2560: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21  K;.}.#endif /* !
2570: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
2580: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66  ED_CACHE */..#if
2590: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
25a0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
25b0: 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20 6f  .** Add a lock o
25c0: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
25d0: 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c   root-page iTabl
25e0: 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d  e to the shared-
25f0: 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62 79  btree used.** by
2600: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
2610: 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63 6b   Parameter eLock
2620: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
2630: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a 2a  READ_LOCK or .**
2640: 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a 0a   WRITE_LOCK..**.
2650: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2660: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2670: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2680: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2690: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 53  TE_BUSY and.** S
26a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61 79 20  QLITE_NOMEM may 
26b0: 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e 65 64  also be returned
26c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26d0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
26e0: 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70  bleLock(Btree *p
26f0: 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75  , Pgno iTable, u
2700: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
2710: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2720: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c  Bt;.  BtLock *pL
2730: 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63  ock = 0;.  BtLoc
2740: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
2750: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2760: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
2770: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
2780: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
27b0: 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  ->db!=0 );..  /*
27c0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
27d0: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
27e0: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
27f0: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2800: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2820: 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  K;.  }..  assert
2830: 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65  ( SQLITE_OK==que
2840: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
2850: 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
2860: 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f  , eLock) );..  /
2870: 2a 20 49 66 20 74 68 65 20 72 65 61 64 2d 75 6e  * If the read-un
2880: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
2890: 73 20 73 65 74 20 61 6e 64 20 61 20 72 65 61 64  s set and a read
28a0: 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74  -lock is request
28b0: 65 64 20 6f 6e 0a 20 20 2a 2a 20 61 20 6e 6f 6e  ed on.  ** a non
28c0: 2d 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 74  -schema table, t
28d0: 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  hen the lock is 
28e0: 61 6c 77 61 79 73 20 67 72 61 6e 74 65 64 2e 20  always granted. 
28f0: 20 52 65 74 75 72 6e 20 65 61 72 6c 79 0a 20 20   Return early.  
2900: 2a 2a 20 77 69 74 68 6f 75 74 20 61 64 64 69 6e  ** without addin
2910: 67 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68  g an entry to th
2920: 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b  e BtShared.pLock
2930: 20 6c 69 73 74 2e 20 53 65 65 0a 20 20 2a 2a 20   list. See.  ** 
2940: 63 6f 6d 6d 65 6e 74 20 69 6e 20 66 75 6e 63 74  comment in funct
2950: 69 6f 6e 20 71 75 65 72 79 53 68 61 72 65 64 43  ion querySharedC
2960: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2970: 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 0a 20 20  for more info.  
2980: 2a 2a 20 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 74  ** on handling t
2990: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
29a0: 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20  ed flag..  */.  
29b0: 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64 62 2d  if( .    (p->db-
29c0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
29d0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 26  adUncommitted) &
29e0: 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d 3d 52  & .    (eLock==R
29f0: 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20 20 20  EAD_LOCK) &&.   
2a00: 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45 52 5f   iTable!=MASTER_
2a10: 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20 72 65  ROOT.  ){.    re
2a20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2a30: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
2a40: 73 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20  search the list 
2a50: 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
2a60: 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74 61 62  lock on this tab
2a70: 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 49 74  le. */.  for(pIt
2a80: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
2a90: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
2aa0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  r->pNext){.    i
2ab0: 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65  f( pIter->iTable
2ac0: 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49 74 65  ==iTable && pIte
2ad0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  r->pBtree==p ){.
2ae0: 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20 70 49        pLock = pI
2af0: 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ter;.      break
2b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
2b10: 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 73  * If the above s
2b20: 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20 66 69  earch did not fi
2b30: 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74 72 75  nd a BtLock stru
2b40: 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67 20 42  ct associating B
2b50: 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69 74 68  tree p.  ** with
2b60: 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c 20 61   table iTable, a
2b70: 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e 64 20  llocate one and 
2b80: 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74 68 65  link it into the
2b90: 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   list..  */.  if
2ba0: 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( !pLock ){.    
2bb0: 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63 6b 20  pLock = (BtLock 
2bc0: 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  *)sqlite3MallocZ
2bd0: 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c 6f 63  ero(sizeof(BtLoc
2be0: 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21 70 4c  k));.    if( !pL
2bf0: 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ock ){.      ret
2c00: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
2c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
2c20: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
2c30: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
2c40: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
2c50: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
2c60: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
2c70: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
2c80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
2c90: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
2ca0: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
2cb0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
2cc0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
2cd0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
2ce0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
2cf0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
2d00: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
2d10: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
2d20: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
2d30: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
2d40: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
2d50: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
2d60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
2d70: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
2d80: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
2d90: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
2da0: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
2db0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
2dc0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2dd0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
2de0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
2df0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
2e00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2e10: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
2e20: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
2e30: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
2e40: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
2e50: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
2e60: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
2e70: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
2e80: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
2e90: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
2ea0: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
2eb0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
2ec0: 68 61 74 20 68 61 6e 64 6c 65 20 70 20 68 61 73  hat handle p has
2ed0: 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72   an open read or
2ee0: 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73   write .** trans
2ef0: 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f  action. If it do
2f00: 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65  es not, then the
2f10: 20 42 74 53 68 61 72 65 64 2e 69 73 50 65 6e 64   BtShared.isPend
2f20: 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ing variable.** 
2f30: 6d 61 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74  may be incorrect
2f40: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73  ly cleared..*/.s
2f50: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
2f60: 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
2f70: 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a  bleLocks(Btree *
2f80: 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
2f90: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2fa0: 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20  BtLock **ppIter 
2fb0: 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a  = &pBt->pLock;..
2fc0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2fd0: 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2fe0: 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
2ff0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20   p->sharable || 
3000: 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20  0==*ppIter );.  
3010: 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
3020: 6e 73 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65  ns>0 );..  while
3030: 28 20 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20  ( *ppIter ){.   
3040: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d   BtLock *pLock =
3050: 20 2a 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73   *ppIter;.    as
3060: 73 65 72 74 28 20 70 42 74 2d 3e 69 73 45 78 63  sert( pBt->isExc
3070: 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70 42 74  lusive==0 || pBt
3080: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b  ->pWriter==pLock
3090: 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20  ->pBtree );.    
30a0: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70  assert( pLock->p
30b0: 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d  Btree->inTrans>=
30c0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a  pLock->eLock );.
30d0: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70      if( pLock->p
30e0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
30f0: 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f 63    *ppIter = pLoc
3100: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  k->pNext;.      
3110: 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69  assert( pLock->i
3120: 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63  Table!=1 || pLoc
3130: 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20  k==&p->lock );. 
3140: 20 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e       if( pLock->
3150: 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20  iTable!=1 ){.   
3160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
3170: 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  e(pLock);.      
3180: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
3190: 20 20 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f     ppIter = &pLo
31a0: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ck->pNext;.    }
31b0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
31c0: 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 3d 3d  pBt->isPending==
31d0: 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65  0 || pBt->pWrite
31e0: 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  r );.  if( pBt->
31f0: 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20  pWriter==p ){.  
3200: 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d    pBt->pWriter =
3210: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 45   0;.    pBt->isE
3220: 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20 20  xclusive = 0;.  
3230: 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67    pBt->isPending
3240: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
3250: 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
3260: 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a  ion==2 ){.    /*
3270: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3280: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 63 6f  s called when co
3290: 6e 6e 65 63 74 69 6f 6e 20 70 20 69 73 20 63 6f  nnection p is co
32a0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
32b0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
32c0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
32d0: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
32e0: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
32f0: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3300: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3310: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3320: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3330: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3340: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3350: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3360: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
3370: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
3380: 20 2a 2a 20 73 65 74 20 74 68 65 20 69 73 50 65   ** set the isPe
3390: 6e 64 69 6e 67 20 66 6c 61 67 20 74 6f 20 30 2e  nding flag to 0.
33a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
33b0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
33c0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
33d0: 72 2c 20 74 68 65 6e 20 42 74 53 68 61 72 65 64  r, then BtShared
33e0: 2e 69 73 50 65 6e 64 69 6e 67 20 6d 75 73 74 0a  .isPending must.
33f0: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3400: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3410: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3420: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3430: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3440: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
3450: 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  0;.  }.}..static
3460: 20 76 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41   void downgradeA
3470: 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
3480: 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70  leLocks(Btree *p
3490: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
34a0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
34b0: 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d  f( pBt->pWriter=
34c0: 3d 70 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  =p ){.    BtLock
34d0: 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74   *pLock;.    pBt
34e0: 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20  ->pWriter = 0;. 
34f0: 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73     pBt->isExclus
3500: 69 76 65 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ive = 0;.    pBt
3510: 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20 30 3b  ->isPending = 0;
3520: 0a 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  .    for(pLock=p
3530: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
3540: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
3550: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73  Next){.      ass
3560: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ert( pLock->eLoc
3570: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
3580: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70  pLock->pBtree==p
3590: 20 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d   );.      pLock-
35a0: 3e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  >eLock = READ_LO
35b0: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  CK;.    }.  }.}.
35c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
35d0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
35e0: 43 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76  CHE */..static v
35f0: 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
3600: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b  MemPage *pPage);
3610: 20 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66    /* Forward ref
3620: 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  erence */../*.**
3630: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
3640: 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20   cursor holds a 
3650: 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
3660: 68 61 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66  hared.*/.#ifndef
3670: 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 69   NDEBUG.static i
3680: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3690: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
36a0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
36b0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
36c0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
36d0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66  #endif...#ifndef
36e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
36f0: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  RBLOB./*.** Inva
3700: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3710: 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
3720: 63 68 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70  che for cursor p
3730: 43 75 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  Cur, if any..*/.
3740: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
3750: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3760: 63 68 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  che(BtCursor *pC
3770: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
3780: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
3790: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
37a0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
37b0: 76 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72  verflow);.  pCur
37c0: 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->aOverflow = 0;
37d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  .}../*.** Invali
37e0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
37f0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
3800: 65 20 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72  e for all cursor
3810: 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74  s opened.** on t
3820: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3830: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3850: 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
3860: 6c 6f 77 43 61 63 68 65 28 42 74 53 68 61 72 65  lowCache(BtShare
3870: 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72  d *pBt){.  BtCur
3880: 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74  sor *p;.  assert
3890: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
38a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
38b0: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
38c0: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
38d0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
38e0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
38f0: 43 61 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  Cache(p);.  }.}.
3900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
3910: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62  tion is called b
3920: 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20  efore modifying 
3930: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
3940: 61 20 74 61 62 6c 65 0a 2a 2a 20 62 2d 74 72 65  a table.** b-tre
3950: 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  e to invalidate 
3960: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
3970: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
3980: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
3990: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
39a0: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
39b0: 65 64 2e 20 41 72 67 75 6d 65 6e 74 20 70 67 6e  ed. Argument pgn
39c0: 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 0a 2a 2a  oRoot is the .**
39d0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 74 68   root-page of th
39e0: 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  e table b-tree. 
39f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  .**.** If argume
3a00: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
3a10: 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
3a20: 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74  e entire content
3a30: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s of the.** tabl
3a40: 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  e is about to be
3a50: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
3a60: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
3a70: 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a  e all incrblob.*
3a80: 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  * cursors open o
3a90: 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e  n any row within
3aa0: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
3ab0: 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f  root-page pgnoRo
3ac0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  ot..**.** Otherw
3ad0: 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74  ise, if argument
3ae0: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73   isClearTable is
3af0: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65   false, then the
3b00: 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77   row with.** row
3b10: 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67  id iRow is being
3b20: 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c   replaced or del
3b30: 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  eted. In this ca
3b40: 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a  se invalidate.**
3b50: 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72   only those incr
3b60: 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
3b70: 6e 20 6f 6e 20 74 68 69 73 20 73 70 65 63 69 66  n on this specif
3b80: 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69  ic row..*/.stati
3b90: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3ba0: 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
3bb0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
3bc0: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
3bd0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
3be0: 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 50   to check */.  P
3bf0: 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 20 20  gno pgnoRoot,   
3c00: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66         /* Look f
3c10: 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
3c20: 6f 6e 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f  on this btree */
3c30: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
3c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
3c50: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
3c60: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
3c70: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
3c80: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
3c90: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
3ca0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
3cb0: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
3cc0: 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65  or *p;.  BtShare
3cd0: 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d  d *pBt = pBtree-
3ce0: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
3cf0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
3d00: 73 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29  sMutex(pBtree) )
3d10: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
3d20: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
3d30: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
3d40: 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
3d50: 64 6c 65 20 26 26 20 28 69 73 43 6c 65 61 72 54  dle && (isClearT
3d60: 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e 66 6f 2e  able || p->info.
3d70: 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29 7b 0a 20  nKey==iRow) ){. 
3d80: 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d       p->eState =
3d90: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
3da0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
3db0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  lse.  #define in
3dc0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
3dd0: 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69  Cache(x).  #defi
3de0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  ne invalidateAll
3df0: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
3e00: 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  .  #define inval
3e10: 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
3e20: 73 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65  sors(w,x,y,z).#e
3e30: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
3e40: 62 69 74 20 70 67 6e 6f 20 6f 66 20 74 68 65 20  bit pgno of the 
3e50: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
3e60: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68 69  tent bitvec. Thi
3e70: 73 20 69 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  s is called .** 
3e80: 77 68 65 6e 20 61 20 70 61 67 65 20 74 68 61 74  when a page that
3e90: 20 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74   previously cont
3ea0: 61 69 6e 65 64 20 64 61 74 61 20 62 65 63 6f 6d  ained data becom
3eb0: 65 73 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  es a free-list l
3ec0: 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a  eaf .** page..**
3ed0: 0a 2a 2a 20 54 68 65 20 42 74 53 68 61 72 65 64  .** The BtShared
3ee0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
3ef0: 76 65 63 20 65 78 69 73 74 73 20 74 6f 20 77 6f  vec exists to wo
3f00: 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73  rk around an obs
3f10: 63 75 72 65 0a 2a 2a 20 62 75 67 20 63 61 75 73  cure.** bug caus
3f20: 65 64 20 62 79 20 74 68 65 20 69 6e 74 65 72 61  ed by the intera
3f30: 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65  ction of two use
3f40: 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74  ful IO optimizat
3f50: 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ions surrounding
3f60: 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  .** free-list le
3f70: 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20  af pages:.**.** 
3f80: 20 20 31 29 20 57 68 65 6e 20 61 6c 6c 20 64 61    1) When all da
3f90: 74 61 20 69 73 20 64 65 6c 65 74 65 64 20 66 72  ta is deleted fr
3fa0: 6f 6d 20 61 20 70 61 67 65 20 61 6e 64 20 74 68  om a page and th
3fb0: 65 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a  e page becomes.*
3fc0: 2a 20 20 20 20 20 20 61 20 66 72 65 65 2d 6c 69  *      a free-li
3fd0: 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68  st leaf page, th
3fe0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 77 72  e page is not wr
3ff0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
4000: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 28 61  abase.**      (a
4010: 73 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  s free-list leaf
4020: 20 70 61 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e   pages contain n
4030: 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20 64 61 74  o meaningful dat
4040: 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a  a). Sometimes.**
4050: 20 20 20 20 20 20 73 75 63 68 20 61 20 70 61 67        such a pag
4060: 65 20 69 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f  e is not even jo
4070: 75 72 6e 61 6c 6c 65 64 20 28 61 73 20 69 74 20  urnalled (as it 
4080: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69  will not be modi
4090: 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68  fied,.**      wh
40a0: 79 20 62 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c  y bother journal
40b0: 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a  ling it?)..**.**
40c0: 20 20 20 32 29 20 57 68 65 6e 20 61 20 66 72 65     2) When a fre
40d0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
40e0: 20 69 73 20 72 65 75 73 65 64 2c 20 69 74 73 20   is reused, its 
40f0: 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 72  content is not r
4100: 65 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ead.**      from
4110: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 72   the database or
4120: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4130: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 77 68  journal file (wh
4140: 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20  y should it.**  
4150: 20 20 20 20 62 65 2c 20 69 66 20 69 74 20 69 73      be, if it is
4160: 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e   not at all mean
4170: 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20  ingful?)..**.** 
4180: 42 79 20 74 68 65 6d 73 65 6c 76 65 73 2c 20 74  By themselves, t
4190: 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  hese optimizatio
41a0: 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64  ns work fine and
41b0: 20 70 72 6f 76 69 64 65 20 61 20 68 61 6e 64 79   provide a handy
41c0: 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  .** performance 
41d0: 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b 20 64 65  boost to bulk de
41e0: 6c 65 74 65 20 6f 72 20 69 6e 73 65 72 74 20 6f  lete or insert o
41f0: 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76  perations. Howev
4200: 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70 61 67 65  er, if.** a page
4210: 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   is moved to the
4220: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 74   free-list and t
4230: 68 65 6e 20 72 65 75 73 65 64 20 77 69 74 68 69  hen reused withi
4240: 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72  n the same.** tr
4250: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f  ansaction, a pro
4260: 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49  blem comes up. I
4270: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
4280: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
4290: 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f 76 65 64  n.** it is moved
42a0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
42b0: 74 20 61 6e 64 20 69 74 20 69 73 20 61 6c 73 6f  t and it is also
42c0: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
42d0: 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78  when it.** is ex
42e0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
42f0: 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 72   free-list and r
4300: 65 75 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20  eused, then the 
4310: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a  original data.**
4320: 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e   may be lost. In
4330: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
4340: 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79  rollback, it may
4350: 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62 6c 65   not be possible
4360: 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72 65 20 74  .** to restore t
4370: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69  he database to i
4380: 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66  ts original conf
4390: 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  iguration..**.**
43a0: 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
43b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
43c0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
43d0: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 70 61 67  . Whenever a pag
43e0: 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74  e is .** moved t
43f0: 6f 20 62 65 63 6f 6d 65 20 61 20 66 72 65 65 2d  o become a free-
4400: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c 20  list leaf page, 
4410: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
4420: 67 20 62 69 74 20 69 73 0a 2a 2a 20 73 65 74 20  g bit is.** set 
4430: 69 6e 20 74 68 65 20 62 69 74 76 65 63 2e 20 57  in the bitvec. W
4440: 68 65 6e 65 76 65 72 20 61 20 6c 65 61 66 20 70  henever a leaf p
4450: 61 67 65 20 69 73 20 65 78 74 72 61 63 74 65 64  age is extracted
4460: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
4470: 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61  ist,.** optimiza
4480: 74 69 6f 6e 20 32 20 61 62 6f 76 65 20 69 73 20  tion 2 above is 
4490: 6f 6d 6d 69 74 74 65 64 20 69 66 20 74 68 65 20  ommitted if the 
44a0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
44b0: 74 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  t is already.** 
44c0: 73 65 74 20 69 6e 20 42 74 53 68 61 72 65 64 2e  set in BtShared.
44d0: 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20 54 68 65  pHasContent. The
44e0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
44f0: 20 62 69 74 76 65 63 20 61 72 65 20 63 6c 65 61   bitvec are clea
4500: 72 65 64 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  red.** at the en
4510: 64 20 6f 66 20 65 76 65 72 79 20 74 72 61 6e 73  d of every trans
4520: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4530: 63 20 69 6e 74 20 62 74 72 65 65 53 65 74 48 61  c int btreeSetHa
4540: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4550: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
4560: 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  o){.  int rc = S
4570: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
4580: 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e  !pBt->pHasConten
4590: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 61  t ){.    int nPa
45a0: 67 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ge;.    rc = sql
45b0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
45c0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
45d0: 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  &nPage);.    if(
45e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
45f0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 48 61  {.      pBt->pHa
4600: 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74  sContent = sqlit
4610: 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 28  e3BitvecCreate((
4620: 75 33 32 29 6e 50 61 67 65 29 3b 0a 20 20 20 20  u32)nPage);.    
4630: 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61 73    if( !pBt->pHas
4640: 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20  Content ){.     
4650: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4660: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
4670: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
4680: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
4690: 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76  gno<=sqlite3Bitv
46a0: 65 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73  ecSize(pBt->pHas
46b0: 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20  Content) ){.    
46c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  rc = sqlite3Bitv
46d0: 65 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43  ecSet(pBt->pHasC
46e0: 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20  ontent, pgno);. 
46f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4700: 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  }../*.** Query t
4710: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4720: 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a  Content vector..
4730: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
4740: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
4750: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
4760: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f  eaf page is remo
4770: 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ved from the.** 
4780: 66 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65  free-list for re
4790: 75 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20  use. It returns 
47a0: 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73  false if it is s
47b0: 61 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20  afe to retrieve 
47c0: 74 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d  the.** page from
47d0: 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
47e0: 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
47f0: 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
4800: 20 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e   True otherwise.
4810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4820: 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
4830: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4840: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42   Pgno pgno){.  B
4850: 69 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e  itvec *p = pBt->
4860: 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72  pHasContent;.  r
4870: 65 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e  eturn (p && (pgn
4880: 6f 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53  o>sqlite3BitvecS
4890: 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65  ize(p) || sqlite
48a0: 33 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70  3BitvecTest(p, p
48b0: 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gno)));.}../*.**
48c0: 20 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29   Clear (destroy)
48d0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   the BtShared.pH
48e0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
48f0: 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65  . This should be
4900: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74  .** invoked at t
4910: 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
4920: 20 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e   each write-tran
4930: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  saction..*/.stat
4940: 69 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65  ic void btreeCle
4950: 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53  arHasContent(BtS
4960: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
4970: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
4980: 72 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e  roy(pBt->pHasCon
4990: 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48  tent);.  pBt->pH
49a0: 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d  asContent = 0;.}
49b0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
49c0: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
49d0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
49e0: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
49f0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
4a00: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
4a10: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
4a20: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
4a30: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
4a40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
4a50: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
4a60: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4a70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
4a80: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
4a90: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
4aa0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  e );.  assert( 0
4ab0: 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a  ==pCur->pKey );.
4ac0: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
4ad0: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
4ae0: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
4af0: 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
4b00: 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65  pCur, &pCur->nKe
4b10: 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  y);..  /* If thi
4b20: 73 20 69 73 20 61 6e 20 69 6e 74 4b 65 79 20 74  s is an intKey t
4b30: 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 61  able, then the a
4b40: 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20 42 74 72  bove call to Btr
4b50: 65 65 4b 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a  eeKeySize().  **
4b60: 20 73 74 6f 72 65 73 20 74 68 65 20 69 6e 74 65   stores the inte
4b70: 67 65 72 20 6b 65 79 20 69 6e 20 70 43 75 72 2d  ger key in pCur-
4b80: 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69 73 20 63  >nKey. In this c
4b90: 61 73 65 20 74 68 69 73 20 76 61 6c 75 65 20 69  ase this value i
4ba0: 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20  s.  ** all that 
4bb0: 69 73 20 72 65 71 75 69 72 65 64 2e 20 4f 74 68  is required. Oth
4bc0: 65 72 77 69 73 65 2c 20 69 66 20 70 43 75 72 20  erwise, if pCur 
4bd0: 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61  is not open on a
4be0: 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61  n intKey.  ** ta
4bf0: 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63  ble, then malloc
4c00: 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 73   space for and s
4c10: 74 6f 72 65 20 74 68 65 20 70 43 75 72 2d 3e 6e  tore the pCur->n
4c20: 4b 65 79 20 62 79 74 65 73 20 6f 66 20 6b 65 79  Key bytes of key
4c30: 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a   .  ** data..  *
4c40: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
4c50: 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72  TE_OK && 0==pCur
4c60: 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
4c70: 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a  Key){.    void *
4c80: 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  pKey = sqlite3Ma
4c90: 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43 75 72 2d  lloc( (int)pCur-
4ca0: 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28  >nKey );.    if(
4cb0: 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72   pKey ){.      r
4cc0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
4cd0: 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e  Key(pCur, 0, (in
4ce0: 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b  t)pCur->nKey, pK
4cf0: 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ey);.      if( r
4d00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4d10: 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b          pCur->pK
4d20: 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20  ey = pKey;.     
4d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4d40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65  sqlite3_free(pKe
4d50: 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  y);.      }.    
4d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
4d70: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
4d80: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
4d90: 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61 67  rt( !pCur->apPag
4da0: 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
4db0: 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 0a  !pCur->pKey );..
4dc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4dd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
4de0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4df0: 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
4e00: 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
4e10: 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
4e20: 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
4e30: 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d  Cur->apPage[i] =
4e40: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43   0;.    }.    pC
4e50: 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a  ur->iPage = -1;.
4e60: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
4e70: 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   = CURSOR_REQUIR
4e80: 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e  ESEEK;.  }..  in
4e90: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
4ea0: 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 72  Cache(pCur);.  r
4eb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4ec0: 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  ** Save the posi
4ed0: 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72  tions of all cur
4ee0: 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78 63  sors except pExc
4ef0: 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ept open on the 
4f00: 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72  table .** with r
4f10: 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20  oot-page iRoot. 
4f20: 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
4f30: 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66   called just bef
4f40: 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45  ore cursor.** pE
4f50: 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74 6f  xcept is used to
4f60: 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62 6c   modify the tabl
4f70: 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28 29  e (BtreeDelete()
4f80: 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74 28   or BtreeInsert(
4f90: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
4fa0: 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  t saveAllCursors
4fb0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4fc0: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75  Pgno iRoot, BtCu
4fd0: 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b 0a  rsor *pExcept){.
4fe0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
4ff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5000: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5010: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
5020: 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30 20  ert( pExcept==0 
5030: 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74 3d  || pExcept->pBt=
5040: 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d  =pBt );.  for(p=
5050: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
5060: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
5070: 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70 74    if( p!=pExcept
5080: 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c   && (0==iRoot ||
5090: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
50a0: 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20 20  oot) && .       
50b0: 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
50c0: 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
50d0: 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65 43    int rc = saveC
50e0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
50f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
5100: 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
5110: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
5120: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5130: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5140: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
5150: 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e 74  lear the current
5160: 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
5170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5180: 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
5190: 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  r(BtCursor *pCur
51a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
51b0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
51c0: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
51d0: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
51e0: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
51f0: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
5200: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
5210: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
5220: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
5230: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
5240: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
5250: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
5260: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
5270: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
5280: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
5290: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
52a0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
52b0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
52c0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
52d0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
52e0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
52f0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
5300: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
5310: 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ve restoreCursor
5320: 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c 20  Position() call 
5330: 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20 73  after each .** s
5340: 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  aveCursorPositio
5350: 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n()..*/.int sqli
5360: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43  te3BtreeRestoreC
5370: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
5380: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
5390: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
53a0: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
53b0: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
53c0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
53d0: 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate>=CURSOR_REQU
53e0: 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
53f0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5400: 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
5410: 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
5420: 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70 43 75 72  skip;.  }.  pCur
5430: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
5440: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20  R_INVALID;.  rc 
5450: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
5460: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
5470: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
5480: 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e 73 6b 69  y, 0, &pCur->ski
5490: 70 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  p);.  if( rc==SQ
54a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
54b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
54c0: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
54d0: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
54e0: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
54f0: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5500: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
5510: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
5520: 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74  LID );.  }.  ret
5530: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
5540: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
5550: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
5560: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
5570: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
5580: 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   \.         sqli
5590: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 43  te3BtreeRestoreC
55a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
55b0: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
55c0: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
55d0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
55e0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
55f0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
5600: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 74   the position it
5610: 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6c 61  .** was last pla
5620: 63 65 64 20 61 74 2e 20 20 43 75 72 73 6f 72 73  ced at.  Cursors
5630: 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74   can move when t
5640: 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20  he row they are 
5650: 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61 74 20 69  pointing.** at i
5660: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
5670: 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2e 0a 2a  om under them..*
5680: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5690: 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  e returns an err
56a0: 6f 72 20 63 6f 64 65 20 69 66 20 73 6f 6d 65 74  or code if somet
56b0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
56c0: 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72    The.** integer
56d0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 69 73 20 73   *pHasMoved is s
56e0: 65 74 20 74 6f 20 6f 6e 65 20 69 66 20 74 68 65  et to one if the
56f0: 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65   cursor has move
5700: 64 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  d and 0 if not..
5710: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
5720: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
5730: 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
5740: 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f 76 65 64  , int *pHasMoved
5750: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
5760: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
5770: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
5780: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
5790: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31    *pHasMoved = 1
57a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
57b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d  .  }.  if( pCur-
57c0: 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
57d0: 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 73  VALID || pCur->s
57e0: 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20 20 2a 70  kip!=0 ){.    *p
57f0: 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b 0a 20 20  HasMoved = 1;.  
5800: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 48 61 73  }else{.    *pHas
5810: 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  Moved = 0;.  }. 
5820: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5830: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
5840: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
5850: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
5860: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
5870: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
5880: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
5890: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
58a0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
58b0: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
58c0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
58d0: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
58e0: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
58f0: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  er..*/.static Pg
5900: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
5910: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
5920: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
5930: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
5940: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
5950: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
5960: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5970: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5980: 20 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   );.  nPagesPerM
5990: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
59a0: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
59b0: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
59c0: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
59d0: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
59e0: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
59f0: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
5a00: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
5a10: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
5a20: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
5a30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
5a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
5a50: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
5a60: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
5a70: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
5a80: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
5a90: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
5aa0: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
5ab0: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
5ac0: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
5ad0: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
5ae0: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
5af0: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65   'pgno'..** An e
5b00: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
5b10: 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69  urned if somethi
5b20: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f  ng goes wrong, o
5b30: 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
5b40: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
5b50: 74 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68  t ptrmapPut(BtSh
5b60: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
5b70: 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50  key, u8 eType, P
5b80: 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44  gno parent){.  D
5b90: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
5ba0: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
5bb0: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
5bc0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
5bd0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
5be0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
5bf0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
5c00: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
5c10: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
5c20: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
5c30: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
5c40: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
5c50: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ge */.  int rc;.
5c60: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5c70: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
5c80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
5c90: 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  * The master-jou
5ca0: 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  rnal page number
5cb0: 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75   must never be u
5cc0: 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
5cd0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61   map page */.  a
5ce0: 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50  ssert( 0==PTRMAP
5cf0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e  _ISPAGE(pBt, PEN
5d00: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
5d10: 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  Bt)) );..  asser
5d20: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
5d30: 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d  um );.  if( key=
5d40: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
5d50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
5d60: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72  BKPT;.  }.  iPtr
5d70: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
5d80: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
5d90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
5da0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
5db0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
5dc0: 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
5dd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
5de0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
5df0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
5e00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
5e10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
5e20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
5e30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5e40: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
5e50: 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  }.  pPtrmap = (u
5e60: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
5e70: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
5e80: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
5e90: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
5ea0: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
5eb0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
5ec0: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
5ed0: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
5ee0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
5ef0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
5f00: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
5f10: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
5f20: 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
5f30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
5f40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
5f50: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
5f60: 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 70  = eType;.      p
5f70: 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70  ut4byte(&pPtrmap
5f80: 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72 65  [offset+1], pare
5f90: 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  nt);.    }.  }..
5fa0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
5fb0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
5fc0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5fd0: 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74 72  .** Read an entr
5fe0: 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74  y from the point
5ff0: 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  er map..**.** Th
6000: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72 69  is routine retri
6010: 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72  eves the pointer
6020: 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70   map entry for p
6030: 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74 69  age 'key', writi
6040: 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20 61  ng.** the type a
6050: 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e  nd parent page n
6060: 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70 65  umber to *pEType
6070: 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73 70   and *pPgno resp
6080: 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20  ectively..** An 
6090: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
60a0: 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68  turned if someth
60b0: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20  ing goes wrong, 
60c0: 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  otherwise SQLITE
60d0: 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  _OK..*/.static i
60e0: 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74 53  nt ptrmapGet(BtS
60f0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
6100: 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70 65   key, u8 *pEType
6110: 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a  , Pgno *pPgno){.
6120: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
6130: 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  e;   /* The poin
6140: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
6150: 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20 20    int iPtrmap;  
6160: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6170: 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20 2a  map page index *
6180: 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b  /.  u8 *pPtrmap;
6190: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
61a0: 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61 20  r map page data 
61b0: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
61c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
61d0: 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70 6f  t of entry in po
61e0: 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69  inter map */.  i
61f0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
6200: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6210: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
6220: 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d   );..  iPtrmap =
6230: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
6240: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
6250: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
6260: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
6270: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 29  trmap, &pDbPage)
6280: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
6290: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
62a0: 20 20 7d 0a 20 20 70 50 74 72 6d 61 70 20 3d 20    }.  pPtrmap = 
62b0: 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67  (u8 *)sqlite3Pag
62c0: 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
62d0: 65 29 3b 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20  e);..  offset = 
62e0: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
62f0: 28 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a  (iPtrmap, key);.
6300: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
6310: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
6320: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
6330: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
6340: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
6350: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
6360: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
6370: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
6380: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
6390: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
63a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
63b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
63c0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
63d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
63e0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
63f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
6400: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
6410: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
6420: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
6430: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 47   #define ptrmapG
6440: 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  et(w,x,y,z) SQLI
6450: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
6460: 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
6470: 28 78 2c 20 79 29 20 53 51 4c 49 54 45 5f 4f 4b  (x, y) SQLITE_OK
6480: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
6490: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
64a0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
64b0: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
64c0: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
64d0: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
64e0: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
64f0: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
6500: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
6510: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
6520: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
6530: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
6540: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
6550: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
6560: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
6570: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
6580: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
6590: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
65a0: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
65b0: 20 26 20 67 65 74 32 62 79 74 65 28 26 28 50 29   & get2byte(&(P)
65c0: 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63 65 6c  ->aData[(P)->cel
65d0: 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d 29 29  lOffset+2*(I)]))
65e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 20  )../*.** This a 
65f0: 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76 65 72  more complex ver
6600: 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65 6c 6c  sion of findCell
6610: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
6620: 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20  r.** pages that 
6630: 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  do contain overf
6640: 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65 65 20  low cells.  See 
6650: 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74 69 63  insert.*/.static
6660: 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66 6c 6f   u8 *findOverflo
6670: 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  wCell(MemPage *p
6680: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
6690: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
66a0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
66b0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
66c0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
66d0: 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e 4f 76  for(i=pPage->nOv
66e0: 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30 3b 20  erflow-1; i>=0; 
66f0: 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b  i--){.    int k;
6700: 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f 76 66  .    struct _Ovf
6710: 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a 20 20  lCell *pOvfl;.  
6720: 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61 67 65    pOvfl = &pPage
6730: 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20 20 20  ->aOvfl[i];.    
6740: 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78 3b 0a  k = pOvfl->idx;.
6750: 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65 6c 6c      if( k<=iCell
6760: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d   ){.      if( k=
6770: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
6780: 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c 2d 3e    return pOvfl->
6790: 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  pCell;.      }. 
67a0: 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a 20 20       iCell--;.  
67b0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
67c0: 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
67d0: 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   iCell);.}../*.*
67e0: 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63  * Parse a cell c
67f0: 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64  ontent block and
6800: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c   fill in the Cel
6810: 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  lInfo structure.
6820: 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65 20 74    There.** are t
6830: 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
6840: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 20 73  his function.  s
6850: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
6860: 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61 20 0a  Cell() takes a .
6870: 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20 61 73  ** cell index as
6880: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
6890: 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74 65 33  ment and sqlite3
68a0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
68b0: 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20 61 20  r() .** takes a 
68c0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62  pointer to the b
68d0: 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ody of the cell 
68e0: 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20 61 72  as its second ar
68f0: 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  gument..**.** Wi
6900: 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  thin this file, 
6910: 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28 29 20  the parseCell() 
6920: 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63 61 6c  macro can be cal
6930: 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  led instead of.*
6940: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  * sqlite3BtreePa
6950: 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20 55 73  rseCellPtr(). Us
6960: 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  ing some compile
6970: 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  rs, this will be
6980: 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f 69 64   faster..*/.void
6990: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
69a0: 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d  seCellPtr(.  Mem
69b0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
69c0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
69d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
69e0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6a00: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
6a10: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
6a20: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
6a30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
6a40: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
6a50: 65 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 6e 3b  e */.){.  u16 n;
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79 74 65    /* Number byte
6a80: 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74 65 6e  s in cell conten
6a90: 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  t header */.  u3
6aa0: 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20  2 nPayload;     
6ab0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6ac0: 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c  of bytes of cell
6ad0: 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61   payload */..  a
6ae0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6af0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6b00: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6b10: 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c 6c 20  .  pInfo->pCell 
6b20: 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  = pCell;.  asser
6b30: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
6b40: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
6b50: 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70 50 61  ==1 );.  n = pPa
6b60: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
6b70: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 34  ;.  assert( n==4
6b80: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  -4*pPage->leaf )
6b90: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
6ba0: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69 66 28  ntKey ){.    if(
6bb0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
6bc0: 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65  ){.      n += ge
6bd0: 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
6be0: 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  [n], nPayload);.
6bf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6c00: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20   nPayload = 0;. 
6c10: 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20 67 65     }.    n += ge
6c20: 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e  tVarint(&pCell[n
6c30: 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d  ], (u64*)&pInfo-
6c40: 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49 6e 66  >nKey);.    pInf
6c50: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
6c60: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
6c70: 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d    pInfo->nData =
6c80: 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   0;.    n += get
6c90: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
6ca0: 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20  n], nPayload);. 
6cb0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d     pInfo->nKey =
6cc0: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 0a 20   nPayload;.  }. 
6cd0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
6ce0: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
6cf0: 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20 3d 20  Info->nHeader = 
6d00: 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c 79 28  n;.  if( likely(
6d10: 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d  nPayload<=pPage-
6d20: 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  >maxLocal) ){.  
6d30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
6d40: 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63   (easy) common c
6d50: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65 6e  ase where the en
6d60: 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74  tire payload fit
6d70: 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  s.    ** on the 
6d80: 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20  local page.  No 
6d90: 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75  overflow is requ
6da0: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ired..    */.   
6db0: 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20   int nSize;     
6dc0: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
6dd0: 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65  ze of cell conte
6de0: 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  nt in bytes */. 
6df0: 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c     nSize = nPayl
6e00: 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70 49 6e  oad + n;.    pIn
6e10: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
6e20: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  6)nPayload;.    
6e30: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
6e40: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
6e50: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
6e60: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
6e70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
6e80: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
6e90: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
6ea0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
6eb0: 75 31 36 29 6e 53 69 7a 65 3b 0a 20 20 7d 65 6c  u16)nSize;.  }el
6ec0: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
6ed0: 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e  e payload will n
6ee0: 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c  ot fit completel
6ef0: 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  y on the local p
6f00: 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 20  age, we have.   
6f10: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
6f20: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
6f30: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
6f40: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
6f50: 74 6f 0a 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c  to.    ** overfl
6f60: 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73  ow pages.  The s
6f70: 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69  trategy is to mi
6f80: 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e  nimize the amoun
6f90: 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 20 20  t of unused.    
6fa0: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
6fb0: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
6fc0: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
6fd0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
6fe0: 72 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 62  rage.    ** in b
6ff0: 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20  etween minLocal 
7000: 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20  and maxLocal..  
7010: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61 72 6e    **.    ** Warn
7020: 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74  ing:  changing t
7030: 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20  he way overflow 
7040: 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72  payload is distr
7050: 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20  ibuted in any.  
7060: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
7070: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
7080: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
7090: 6d 61 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mat..    */.    
70a0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
70b0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
70c0: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
70d0: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
70e0: 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f  int maxLocal;  /
70f0: 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Maximum amount
7100: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
7110: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 20 20   locally */.    
7120: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
7130: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
7140: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
7150: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
7160: 2f 0a 0a 20 20 20 20 6d 69 6e 4c 6f 63 61 6c 20  /..    minLocal 
7170: 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61  = pPage->minLoca
7180: 6c 3b 0a 20 20 20 20 6d 61 78 4c 6f 63 61 6c 20  l;.    maxLocal 
7190: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
71a0: 6c 3b 0a 20 20 20 20 73 75 72 70 6c 75 73 20 3d  l;.    surplus =
71b0: 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 50 61   minLocal + (nPa
71c0: 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c  yload - minLocal
71d0: 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )%(pPage->pBt->u
71e0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a  sableSize - 4);.
71f0: 20 20 20 20 69 66 28 20 73 75 72 70 6c 75 73 20      if( surplus 
7200: 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  <= maxLocal ){. 
7210: 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63       pInfo->nLoc
7220: 61 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75  al = (u16)surplu
7230: 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  s;.    }else{.  
7240: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
7250: 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61  l = (u16)minLoca
7260: 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  l;.    }.    pIn
7270: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
7280: 28 75 31 36 29 28 70 49 6e 66 6f 2d 3e 6e 4c 6f  (u16)(pInfo->nLo
7290: 63 61 6c 20 2b 20 6e 29 3b 0a 20 20 20 20 70 49  cal + n);.    pI
72a0: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 70 49 6e  nfo->nSize = pIn
72b0: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 2b 20  fo->iOverflow + 
72c0: 34 3b 0a 20 20 7d 0a 7d 0a 23 64 65 66 69 6e 65  4;.  }.}.#define
72d0: 20 70 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65   parseCell(pPage
72e0: 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 20  , iCell, pInfo) 
72f0: 5c 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  \.  sqlite3Btree
7300: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 28 70 50  ParseCellPtr((pP
7310: 61 67 65 29 2c 20 66 69 6e 64 43 65 6c 6c 28 28  age), findCell((
7320: 70 50 61 67 65 29 2c 20 28 69 43 65 6c 6c 29 29  pPage), (iCell))
7330: 2c 20 28 70 49 6e 66 6f 29 29 0a 76 6f 69 64 20  , (pInfo)).void 
7340: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
7350: 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  eCell(.  MemPage
7360: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
7370: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
7380: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
7390: 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20    int iCell,    
73a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
73b0: 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69   cell index.  Fi
73c0: 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f  rst cell is 0 */
73d0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
73e0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
73f0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
7400: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 61 72  ture */.){.  par
7410: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
7420: 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ell, pInfo);.}..
7430: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
7440: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
7450: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
7460: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
7470: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
7480: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
7490: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
74a0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
74b0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
74c0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
74d0: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
74e0: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
74f0: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
7500: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
7510: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
7520: 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  ter..*/.static u
7530: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d  16 cellSizePtr(M
7540: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
7550: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
7560: 2a 70 49 74 65 72 20 3d 20 26 70 43 65 6c 6c 5b  *pIter = &pCell[
7570: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
7580: 69 7a 65 5d 3b 0a 20 20 75 33 32 20 6e 53 69 7a  ize];.  u32 nSiz
7590: 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e;..#ifdef SQLIT
75a0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
75b0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
75c0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
75d0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
75e0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
75f0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
7600: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
7610: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
7620: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
7630: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
7640: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
7650: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
7660: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
7670: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
7680: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
7690: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
76a0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
76b0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
76c0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
76d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
76e0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
76f0: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
7700: 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  fo);.#endif..  i
7710: 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
7720: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
7730: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
7740: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
7750: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
7760: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 53  rint32(pIter, nS
7770: 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
7780: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 30  .      nSize = 0
7790: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
77a0: 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73  pIter now points
77b0: 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69   at the 64-bit i
77c0: 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65  nteger key value
77d0: 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e  , a variable len
77e0: 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65  gth .    ** inte
77f0: 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ger. The followi
7800: 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70  ng block moves p
7810: 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74  Iter to point at
7820: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
7830: 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20      ** past the 
7840: 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76  end of the key v
7850: 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e  alue. */.    pEn
7860: 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20  d = &pIter[9];. 
7870: 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65     while( (*pIte
7880: 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74  r++)&0x80 && pIt
7890: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 65 6c  er<pEnd );.  }el
78a0: 73 65 7b 0a 20 20 20 20 70 49 74 65 72 20 2b 3d  se{.    pIter +=
78b0: 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49 74   getVarint32(pIt
78c0: 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 7d 0a  er, nSize);.  }.
78d0: 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61  .  if( nSize>pPa
78e0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a  ge->maxLocal ){.
78f0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
7900: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
7910: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
7920: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
7930: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
7940: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
7950: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
7960: 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67    if( nSize>pPag
7970: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
7980: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e       nSize = min
7990: 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20  Local;.    }.   
79a0: 20 6e 53 69 7a 65 20 2b 3d 20 34 3b 0a 20 20 7d   nSize += 4;.  }
79b0: 0a 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32  .  nSize += (u32
79c0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
79d0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 69 6e 69  ;..  /* The mini
79e0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 61 6e 79 20  mum size of any 
79f0: 63 65 6c 6c 20 69 73 20 34 20 62 79 74 65 73 2e  cell is 4 bytes.
7a00: 20 2a 2f 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c   */.  if( nSize<
7a10: 34 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 3d  4 ){.    nSize =
7a20: 20 34 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   4;.  }..  asser
7a30: 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69  t( nSize==debugi
7a40: 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 72  nfo.nSize );.  r
7a50: 65 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65  eturn (u16)nSize
7a60: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
7a70: 55 47 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  UG.static u16 ce
7a80: 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a  llSize(MemPage *
7a90: 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c  pPage, int iCell
7aa0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 63 65 6c 6c  ){.  return cell
7ab0: 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 66  SizePtr(pPage, f
7ac0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
7ad0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
7ae0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
7af0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
7b00: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
7b10: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
7b20: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
7b30: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
7b40: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
7b50: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
7b60: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
7b70: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
7b80: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
7b90: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
7ba0: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 4f 76   int ptrmapPutOv
7bb0: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
7bc0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
7bd0: 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  {.  CellInfo inf
7be0: 6f 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  o;.  assert( pCe
7bf0: 6c 6c 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  ll!=0 );.  sqlit
7c00: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
7c10: 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
7c20: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
7c30: 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  rt( (info.nData+
7c40: 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
7c50: 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e  :info.nKey))==in
7c60: 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20  fo.nPayload );. 
7c70: 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
7c80: 6c 6f 77 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  low ){.    Pgno 
7c90: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
7ca0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
7cb0: 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74  rflow]);.    ret
7cc0: 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50  urn ptrmapPut(pP
7cd0: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
7ce0: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
7cf0: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
7d00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7d10: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
7d20: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
7d30: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
7d40: 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20 61  en.  All Cells a
7d50: 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 0a  re moved to the.
7d60: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  ** end of the pa
7d70: 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65 20  ge and all free 
7d80: 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63 74  space is collect
7d90: 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20 62  ed into one.** b
7da0: 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74 20  ig FreeBlk that 
7db0: 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65 65  occurs in betwee
7dc0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  n the header and
7dd0: 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72   cell.** pointer
7de0: 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20 63   array and the c
7df0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
7e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7e10: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 4d  defragmentPage(M
7e20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
7e30: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e50: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
7e60: 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20    int pc;       
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e80: 41 64 64 72 65 73 73 20 6f 66 20 61 20 69 2d 74  Address of a i-t
7e90: 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  h cell */.  int 
7ea0: 61 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  addr;           
7eb0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
7ec0: 20 6f 66 20 66 69 72 73 74 20 62 79 74 65 20 61   of first byte a
7ed0: 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e 74 65  fter cell pointe
7ee0: 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  r array */.  int
7ef0: 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
7f00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
7f10: 74 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  t to the page he
7f20: 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69  ader */.  int si
7f30: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
7f40: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7f50: 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  a cell */.  int 
7f60: 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
7f70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7f80: 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74 65 73   of usable bytes
7f90: 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   on a page */.  
7fa0: 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
7fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
7fc0: 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  fset to the cell
7fd0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
7fe0: 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20  /.  int cbrk;   
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8000: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
8010: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
8020: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  a */.  int nCell
8030: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8040: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
8050: 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ells on the page
8060: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
8070: 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
8080: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64 61 74   /* The page dat
8090: 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  a */.  unsigned 
80a0: 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20  char *temp;     
80b0: 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66    /* Temp area f
80c0: 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  or cell content 
80d0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
80e0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
80f0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
8100: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
8110: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
8120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
8130: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
8140: 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d  Size <= SQLITE_M
8150: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
8160: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8170: 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
8180: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8190: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
81a0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
81b0: 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73 71 6c   );.  temp = sql
81c0: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
81d0: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
81e0: 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61 20 3d  Pager);.  data =
81f0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
8200: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
8210: 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f  rOffset;.  cellO
8220: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
8230: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65  ellOffset;.  nCe
8240: 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
8250: 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65  l;.  assert( nCe
8260: 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61  ll==get2byte(&da
8270: 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20  ta[hdr+3]) );.  
8280: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 61  usableSize = pPa
8290: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
82a0: 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  ize;.  cbrk = ge
82b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
82c0: 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  +5]);.  memcpy(&
82d0: 74 65 6d 70 5b 63 62 72 6b 5d 2c 20 26 64 61 74  temp[cbrk], &dat
82e0: 61 5b 63 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53  a[cbrk], usableS
82f0: 69 7a 65 20 2d 20 63 62 72 6b 29 3b 0a 20 20 63  ize - cbrk);.  c
8300: 62 72 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  brk = usableSize
8310: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
8320: 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
8330: 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20 2f  u8 *pAddr;     /
8340: 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  * The i-th cell 
8350: 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70  pointer */.    p
8360: 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65 6c  Addr = &data[cel
8370: 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a  lOffset + i*2];.
8380: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
8390: 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 69 66  e(pAddr);.    if
83a0: 28 20 70 63 3e 3d 75 73 61 62 6c 65 53 69 7a 65  ( pc>=usableSize
83b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
83c0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
83d0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
83e0: 73 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  size = cellSizeP
83f0: 74 72 28 70 50 61 67 65 2c 20 26 74 65 6d 70 5b  tr(pPage, &temp[
8400: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
8410: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
8420: 63 62 72 6b 3c 63 65 6c 6c 4f 66 66 73 65 74 2b  cbrk<cellOffset+
8430: 32 2a 6e 43 65 6c 6c 20 7c 7c 20 70 63 2b 73 69  2*nCell || pc+si
8440: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
8450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8460: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8470: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
8480: 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65 3c 3d  ert( cbrk+size<=
8490: 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20 63 62  usableSize && cb
84a0: 72 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 6d 65 6d  rk>=0 );.    mem
84b0: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
84c0: 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a 65   &temp[pc], size
84d0: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
84e0: 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20  pAddr, cbrk);.  
84f0: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
8500: 3e 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e  >=cellOffset+2*n
8510: 43 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79  Cell );.  put2by
8520: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
8530: 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68   cbrk);.  data[h
8540: 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74  dr+1] = 0;.  dat
8550: 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20  a[hdr+2] = 0;.  
8560: 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b  data[hdr+7] = 0;
8570: 0a 20 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66  .  addr = cellOf
8580: 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20  fset+2*nCell;.  
8590: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64  memset(&data[add
85a0: 72 5d 2c 20 30 2c 20 63 62 72 6b 2d 61 64 64 72  r], 0, cbrk-addr
85b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
85c0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
85d0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
85e0: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63 62  age) );.  if( cb
85f0: 72 6b 2d 61 64 64 72 21 3d 70 50 61 67 65 2d 3e  rk-addr!=pPage->
8600: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
8610: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8620: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
8630: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
8650: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
8660: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
8670: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
8680: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
8690: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
86a0: 65 6e 74 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ent. Return the 
86b0: 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65  index into pPage
86c0: 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68 65  ->aData[] of the
86d0: 20 0a 2a 2a 20 66 69 72 73 74 20 62 79 74 65 20   .** first byte 
86e0: 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61  of allocated spa
86f0: 63 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ce. .**.** The c
8700: 61 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73  aller guarantees
8710: 20 74 68 61 74 20 74 68 65 20 73 70 61 63 65 20   that the space 
8720: 62 65 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20  between the end 
8730: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 6f 66 66 73  of the cell-offs
8740: 65 74 20 0a 2a 2a 20 61 72 72 61 79 20 61 6e 64  et .** array and
8750: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
8760: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
8770: 72 65 61 20 69 73 20 61 74 20 6c 65 61 73 74 20  rea is at least 
8780: 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 69  nByte bytes.** i
8790: 6e 20 73 69 7a 65 2e 20 53 6f 20 74 68 69 73 20  n size. So this 
87a0: 72 6f 75 74 69 6e 65 20 63 61 6e 20 6e 65 76 65  routine can neve
87b0: 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  r fail..**.** If
87c0: 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
87d0: 64 79 20 36 30 20 6f 72 20 6d 6f 72 65 20 62 79  dy 60 or more by
87e0: 74 65 73 20 6f 66 20 66 72 61 67 6d 65 6e 74 73  tes of fragments
87f0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
8800: 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73  ,.** the page is
8810: 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20 62 65   defragmented be
8820: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
8830: 49 66 20 74 68 69 73 20 77 65 72 65 20 6e 6f 74  If this were not
8840: 20 64 6f 6e 65 20 74 68 65 72 65 0a 2a 2a 20 69   done there.** i
8850: 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
8860: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
8870: 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 63  agmented bytes c
8880: 6f 75 6c 64 20 65 76 65 6e 74 75 61 6c 6c 79 20  ould eventually 
8890: 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 74 68 65  .** overflow the
88a0: 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69 65   single-byte fie
88b0: 6c 64 20 6f 66 20 74 68 65 20 70 61 67 65 2d 68  ld of the page-h
88c0: 65 61 64 65 72 20 69 6e 20 77 68 69 63 68 20 74  eader in which t
88d0: 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  his value.** is 
88e0: 73 74 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  stored..*/.stati
88f0: 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70  c int allocateSp
8900: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
8910: 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a  ge, int nByte){.
8920: 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
8930: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
8940: 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  et;    /* Local 
8950: 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e  cache of pPage->
8960: 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20 75  hdrOffset */.  u
8970: 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d  8 * const data =
8980: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20   pPage->aData;  
8990: 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63      /* Local cac
89a0: 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  he of pPage->aDa
89b0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61  ta */.  int nFra
89c0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
89e0: 4e 75 6d 62 65 72 20 6f 66 20 66 72 61 67 6d 65  Number of fragme
89f0: 6e 74 65 64 20 62 79 74 65 73 20 6f 6e 20 70 50  nted bytes on pP
8a00: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
8a10: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
8a20: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
8a30: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
8a40: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
8a50: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
8a60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8a70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
8a80: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
8a90: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
8aa0: 42 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d  Byte>=0 );  /* M
8ab0: 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65  inimum cell size
8ac0: 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72   is 4 */.  asser
8ad0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
8ae0: 3d 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65  =nByte );.  asse
8af0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
8b00: 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  flow==0 );..  /*
8b10: 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
8b20: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74   space between t
8b30: 68 65 20 63 65 6c 6c 2d 6f 66 66 73 65 74 20 61  he cell-offset a
8b40: 72 72 61 79 20 61 6e 64 20 74 68 65 20 0a 20 20  rray and the .  
8b50: 2a 2a 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  ** cell-content 
8b60: 61 72 65 61 20 69 73 20 67 72 65 61 74 65 72 20  area is greater 
8b70: 74 68 61 6e 20 6e 42 79 74 65 20 62 79 74 65 73  than nByte bytes
8b80: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
8b90: 20 6e 42 79 74 65 20 3c 3d 20 28 0a 20 20 20 20   nByte <= (.    
8ba0: 20 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61    get2byte(&data
8bb0: 5b 68 64 72 2b 35 5d 29 2d 28 68 64 72 2b 38 2b  [hdr+5])-(hdr+8+
8bc0: 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34  (pPage->leaf?0:4
8bd0: 29 2b 32 2a 67 65 74 32 62 79 74 65 28 26 64 61  )+2*get2byte(&da
8be0: 74 61 5b 68 64 72 2b 33 5d 29 29 0a 20 20 29 29  ta[hdr+3])).  ))
8bf0: 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20 64 61 74  ;..  nFrag = dat
8c00: 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69 66 28 20  a[hdr+7];.  if( 
8c10: 6e 46 72 61 67 3e 3d 36 30 20 29 7b 0a 20 20 20  nFrag>=60 ){.   
8c20: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
8c30: 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  pPage);.  }else{
8c40: 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
8c50: 68 65 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  he freelist look
8c60: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
8c70: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
8c80: 6f 20 73 61 74 69 73 66 79 20 0a 20 20 20 20 2a  o satisfy .    *
8c90: 2a 20 74 68 65 20 72 65 71 75 65 73 74 2e 20 54  * the request. T
8ca0: 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
8cb0: 20 6d 61 64 65 20 66 72 6f 6d 20 74 68 65 20 66   made from the f
8cc0: 69 72 73 74 20 66 72 65 65 20 73 6c 6f 74 20 69  irst free slot i
8cd0: 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 69  n .    ** the li
8ce0: 73 74 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  st that is large
8cf0: 20 65 6e 6f 75 67 68 20 74 6f 20 61 63 63 6f 6d   enough to accom
8d00: 61 64 61 74 65 20 69 74 2e 0a 20 20 20 20 2a 2f  adate it..    */
8d10: 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 61 64 64  .    int pc, add
8d20: 72 3b 0a 20 20 20 20 66 6f 72 28 61 64 64 72 3d  r;.    for(addr=
8d30: 68 64 72 2b 31 3b 20 28 70 63 20 3d 20 67 65 74  hdr+1; (pc = get
8d40: 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72  2byte(&data[addr
8d50: 5d 29 29 3e 30 3b 20 61 64 64 72 3d 70 63 29 7b  ]))>0; addr=pc){
8d60: 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a 65 20  .      int size 
8d70: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
8d80: 5b 70 63 2b 32 5d 29 3b 20 20 20 20 20 2f 2a 20  [pc+2]);     /* 
8d90: 53 69 7a 65 20 6f 66 20 66 72 65 65 20 73 6c 6f  Size of free slo
8da0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73  t */.      if( s
8db0: 69 7a 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20  ize>=nByte ){.  
8dc0: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 73 69        int x = si
8dd0: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
8de0: 20 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20      if( x<4 ){. 
8df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f           /* Remo
8e00: 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d  ve the slot from
8e10: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20   the free-list. 
8e20: 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65  Update the numbe
8e30: 72 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a  r of.          *
8e40: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
8e50: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
8e60: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ge. */.         
8e70: 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61 64   memcpy(&data[ad
8e80: 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c 20  dr], &data[pc], 
8e90: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 61  2);.          da
8ea0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 28 75 38 29  ta[hdr+7] = (u8)
8eb0: 28 6e 46 72 61 67 20 2b 20 78 29 3b 0a 20 20 20  (nFrag + x);.   
8ec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8ed0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
8ee0: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
8ef0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
8f00: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
8f10: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
8f20: 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74   ** for the port
8f30: 69 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20  ion used by the 
8f40: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
8f50: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  */.          put
8f60: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32  2byte(&data[pc+2
8f70: 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ], x);.        }
8f80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8f90: 70 63 20 2b 20 78 3b 0a 20 20 20 20 20 20 7d 0a  pc + x;.      }.
8fa0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8fb0: 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
8fc0: 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20  from the gap in 
8fd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c  between the cell
8fe0: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20   pointer array. 
8ff0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c   ** and the cell
9000: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 20   content area.. 
9010: 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74 32   */.  top = get2
9020: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
9030: 5d 29 20 2d 20 6e 42 79 74 65 3b 0a 20 20 70 75  ]) - nByte;.  pu
9040: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
9050: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72 65 74  +5], top);.  ret
9060: 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn top;.}../*.*
9070: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
9080: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
9090: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
90a0: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
90b0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
90c0: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
90d0: 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73 6b 5b  is pPage->aDisk[
90e0: 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68  start].** and th
90f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 6c  e size of the bl
9100: 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20 62 79  ock is "size" by
9110: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  tes..**.** Most 
9120: 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20 68 65  of the effort he
9130: 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  re is involved i
9140: 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64 6a 61  n coalesing adja
9150: 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62 6c 6f  cent.** free blo
9160: 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  cks into a singl
9170: 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f 63 6b  e big free block
9180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9190: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
91a0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 73 74  e *pPage, int st
91b0: 61 72 74 2c 20 69 6e 74 20 73 69 7a 65 29 7b 0a  art, int size){.
91c0: 20 20 69 6e 74 20 61 64 64 72 2c 20 70 62 65 67    int addr, pbeg
91d0: 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e 73 69 67  in, hdr;.  unsig
91e0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d  ned char *data =
91f0: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 0a   pPage->aData;..
9200: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
9210: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
9220: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
9230: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
9240: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
9250: 20 20 61 73 73 65 72 74 28 20 73 74 61 72 74 3e    assert( start>
9260: 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  =pPage->hdrOffse
9270: 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66  t+6+(pPage->leaf
9280: 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73 73 65 72  ?0:4) );.  asser
9290: 74 28 20 28 73 74 61 72 74 20 2b 20 73 69 7a 65  t( (start + size
92a0: 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  )<=pPage->pBt->u
92b0: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
92c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
92d0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
92e0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
92f0: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 3e 3d    assert( size>=
9300: 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  0 );   /* Minimu
9310: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
9320: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
9330: 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
9340: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
9350: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
9360: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
9370: 68 65 6e 20 74 68 65 20 53 45 43 55 52 45 5f 44  hen the SECURE_D
9380: 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f 70 74 69  ELETE .  ** opti
9390: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 61 74  on is enabled at
93a0: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 2a 2f   compile-time */
93b0: 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
93c0: 73 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 29  start], 0, size)
93d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
93e0: 64 64 20 74 68 65 20 73 70 61 63 65 20 62 61 63  dd the space bac
93f0: 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  k into the linke
9400: 64 20 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c  d list of freebl
9410: 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72 20 3d 20  ocks */.  hdr = 
9420: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9430: 3b 0a 20 20 61 64 64 72 20 3d 20 68 64 72 20 2b  ;.  addr = hdr +
9440: 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62   1;.  while( (pb
9450: 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28  egin = get2byte(
9460: 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3c 73 74  &data[addr]))<st
9470: 61 72 74 20 26 26 20 70 62 65 67 69 6e 3e 30 20  art && pbegin>0 
9480: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9490: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
94a0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
94b0: 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69  );.    if( pbegi
94c0: 6e 3c 3d 61 64 64 72 20 29 20 7b 0a 20 20 20 20  n<=addr ) {.    
94d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
94e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
94f0: 20 20 7d 0a 20 20 20 20 61 64 64 72 20 3d 20 70    }.    addr = p
9500: 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 69 66 20  begin;.  }.  if 
9510: 28 20 70 62 65 67 69 6e 3e 70 50 61 67 65 2d 3e  ( pbegin>pPage->
9520: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
9530: 34 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  4 ) {.    return
9540: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
9550: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
9560: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
9570: 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b 0a  || pbegin==0 );.
9580: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
9590: 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b 0a  [addr], start);.
95a0: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
95b0: 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e 29  [start], pbegin)
95c0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
95d0: 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69 7a  ta[start+2], siz
95e0: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
95f0: 65 65 20 3d 20 70 50 61 67 65 2d 3e 6e 46 72 65  ee = pPage->nFre
9600: 65 20 2b 20 28 75 31 36 29 73 69 7a 65 3b 0a 0a  e + (u16)size;..
9610: 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64    /* Coalesce ad
9620: 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63  jacent free bloc
9630: 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70  ks */.  addr = p
9640: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
9650: 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  + 1;.  while( (p
9660: 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65  begin = get2byte
9670: 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30  (&data[addr]))>0
9680: 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78   ){.    int pnex
9690: 74 2c 20 70 73 69 7a 65 2c 20 78 3b 0a 20 20 20  t, psize, x;.   
96a0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e   assert( pbegin>
96b0: 61 64 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65  addr );.    asse
96c0: 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67  rt( pbegin<=pPag
96d0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
96e0: 7a 65 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78  ze-4 );.    pnex
96f0: 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  t = get2byte(&da
9700: 74 61 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20  ta[pbegin]);.   
9710: 20 70 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74   psize = get2byt
9720: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32  e(&data[pbegin+2
9730: 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67  ]);.    if( pbeg
9740: 69 6e 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e  in + psize + 3 >
9750: 3d 20 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74  = pnext && pnext
9760: 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >0 ){.      int 
9770: 66 72 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28  frag = pnext - (
9780: 70 62 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20  pbegin+psize);. 
9790: 20 20 20 20 20 69 66 28 20 28 66 72 61 67 3c 30       if( (frag<0
97a0: 29 20 7c 7c 20 28 66 72 61 67 3e 28 69 6e 74 29  ) || (frag>(int)
97b0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
97c0: 66 66 73 65 74 2b 37 5d 29 20 29 7b 0a 20 20 20  ffset+7]) ){.   
97d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
97e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
97f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64  .      }.      d
9800: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
9810: 66 73 65 74 2b 37 5d 20 2d 3d 20 28 75 38 29 66  fset+7] -= (u8)f
9820: 72 61 67 3b 0a 20 20 20 20 20 20 78 20 3d 20 67  rag;.      x = g
9830: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
9840: 65 78 74 5d 29 3b 0a 20 20 20 20 20 20 70 75 74  ext]);.      put
9850: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
9860: 69 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20 78  in], x);.      x
9870: 20 3d 20 70 6e 65 78 74 20 2b 20 67 65 74 32 62   = pnext + get2b
9880: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b  yte(&data[pnext+
9890: 32 5d 29 20 2d 20 70 62 65 67 69 6e 3b 0a 20 20  2]) - pbegin;.  
98a0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
98b0: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 78 29  ta[pbegin+2], x)
98c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
98d0: 20 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e     addr = pbegin
98e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
98f0: 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
9900: 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e  ntent area begin
9910: 73 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f  s with a freeblo
9920: 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a  ck, remove it. *
9930: 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72  /.  if( data[hdr
9940: 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d  +1]==data[hdr+5]
9950: 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d   && data[hdr+2]=
9960: 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a  =data[hdr+6] ){.
9970: 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20      int top;.   
9980: 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79   pbegin = get2by
9990: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
99a0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
99b0: 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61  ta[hdr+1], &data
99c0: 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20  [pbegin], 2);.  
99d0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
99e0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 2b  (&data[hdr+5]) +
99f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9a00: 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20  pbegin+2]);.    
9a10: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
9a20: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d  dr+5], top);.  }
9a30: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9a40: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
9a50: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
9a60: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
9a70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
9a80: 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66 6c  ** Decode the fl
9a90: 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66 69  ags byte (the fi
9aa0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
9ab0: 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70 61  header) for a pa
9ac0: 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  ge.** and initia
9ad0: 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20 74  lize fields of t
9ae0: 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75 63  he MemPage struc
9af0: 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  ture accordingly
9b00: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65  ..**.** Only the
9b10: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
9b20: 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70 70  nations are supp
9b30: 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e 67  orted.  Anything
9b40: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69 6e   different.** in
9b50: 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75 70  dicates a corrup
9b60: 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  t database files
9b70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
9b80: 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a 20  PTF_ZERODATA.** 
9b90: 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f          PTF_ZERO
9ba0: 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46 0a  DATA | PTF_LEAF.
9bb0: 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c  **         PTF_L
9bc0: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
9bd0: 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20 20  TKEY.**         
9be0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
9bf0: 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46 5f  TF_INTKEY | PTF_
9c00: 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69  LEAF.*/.static i
9c10: 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28 4d  nt decodeFlags(M
9c20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
9c30: 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20 20  nt flagByte){.  
9c40: 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
9c50: 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20     /* A copy of 
9c60: 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20  pPage->pBt */.. 
9c70: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c80: 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61 67  hdrOffset==(pPag
9c90: 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30  e->pgno==1 ? 100
9ca0: 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72   : 0) );.  asser
9cb0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9cc0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9cd0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
9ce0: 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38 29  age->leaf = (u8)
9cf0: 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20 20  (flagByte>>3);  
9d00: 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41 46  assert( PTF_LEAF
9d10: 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66 6c   == 1<<3 );.  fl
9d20: 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f 4c  agByte &= ~PTF_L
9d30: 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63 68  EAF;.  pPage->ch
9d40: 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d 34  ildPtrSize = 4-4
9d50: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20  *pPage->leaf;.  
9d60: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
9d70: 3b 0a 20 20 69 66 28 20 66 6c 61 67 42 79 74 65  ;.  if( flagByte
9d80: 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20  ==(PTF_LEAFDATA 
9d90: 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b  | PTF_INTKEY) ){
9da0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
9db0: 65 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  ey = 1;.    pPag
9dc0: 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 70 50 61  e->hasData = pPa
9dd0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20 70 50  ge->leaf;.    pP
9de0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
9df0: 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20  pBt->maxLeaf;.  
9e00: 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61    pPage->minLoca
9e10: 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  l = pBt->minLeaf
9e20: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
9e30: 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f  agByte==PTF_ZERO
9e40: 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50 61 67  DATA ){.    pPag
9e50: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
9e60: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
9e70: 61 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  a = 0;.    pPage
9e80: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74  ->maxLocal = pBt
9e90: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
9ea0: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
9eb0: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  = pBt->minLocal;
9ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
9ed0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
9ee0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
9ef0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
9f00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
9f10: 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
9f20: 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
9f30: 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
9f40: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
9f50: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
9f60: 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
9f70: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
9f80: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
9f90: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
9fa0: 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
9fb0: 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
9fc0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
9fd0: 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
9fe0: 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
9ff0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
a000: 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
a010: 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
a020: 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
a030: 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
a040: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
a050: 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
a060: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
a070: 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
a080: 67 65 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61  ge *pPage){..  a
a090: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
a0a0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
a0b0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a0c0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
a0d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
a0e0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
a0f0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
a100: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
a110: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
a120: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
a130: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
a140: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
a150: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
a160: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
a170: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
a180: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
a190: 61 67 65 29 20 29 3b 0a 0a 20 20 69 66 28 20 21  age) );..  if( !
a1a0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b  pPage->isInit ){
a1b0: 0a 20 20 20 20 75 31 36 20 70 63 3b 20 20 20 20  .    u16 pc;    
a1c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
a1d0: 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63  ss of a freebloc
a1e0: 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e  k within pPage->
a1f0: 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75  aData[] */.    u
a200: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
a210: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62    /* Offset to b
a220: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65  eginning of page
a230: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75   header */.    u
a240: 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
a250: 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50    /* Equal to pP
a260: 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20  age->aData */.  
a270: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
a280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
a290: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
a2a0: 75 72 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 75  ure */.    u16 u
a2b0: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
a2c0: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
a2d0: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
a2e0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 75 31 36 20  page */.    u16 
a2f0: 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f  cellOffset;    /
a300: 2a 20 4f 66 66 73 65 74 20 66 72 6f 6d 20 73 74  * Offset from st
a310: 61 72 74 20 6f 66 20 70 61 67 65 20 74 6f 20 66  art of page to f
a320: 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
a330: 72 20 2a 2f 0a 20 20 20 20 75 31 36 20 6e 46 72  r */.    u16 nFr
a340: 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ee;         /* N
a350: 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20  umber of unused 
a360: 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61 67  bytes on the pag
a370: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 74 6f 70  e */.    u16 top
a380: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
a390: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
a3a0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
a3b0: 65 61 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d  ea */..    pBt =
a3c0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20   pPage->pBt;..  
a3d0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
a3e0: 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61  drOffset;.    da
a3f0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
a400: 61 3b 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64  a;.    if( decod
a410: 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61  eFlags(pPage, da
a420: 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72  ta[hdr]) ) retur
a430: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a440: 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72  _BKPT;.    asser
a450: 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  t( pBt->pageSize
a460: 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61  >=512 && pBt->pa
a470: 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b  geSize<=32768 );
a480: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  .    pPage->mask
a490: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Page = pBt->page
a4a0: 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 70 50  Size - 1;.    pP
a4b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
a4c0: 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69   0;.    usableSi
a4d0: 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ze = pBt->usable
a4e0: 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Size;.    pPage-
a4f0: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63 65  >cellOffset = ce
a500: 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20 2b  llOffset = hdr +
a510: 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
a520: 65 61 66 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  eaf;.    top = g
a530: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
a540: 72 2b 35 5d 29 3b 0a 20 20 20 20 70 50 61 67 65  r+5]);.    pPage
a550: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
a560: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
a570: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
a580: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
a590: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
a5a0: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
a5b0: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
a5c0: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
a5d0: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
a5e0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a5f0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
a600: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20      }..    /* A 
a610: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
a620: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
a630: 75 73 65 20 75 73 65 20 74 6f 20 72 65 61 64 20  use use to read 
a640: 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20  past the end.   
a650: 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e   ** of page when
a660: 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e   parsing a cell.
a670: 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a    .    **.    **
a680: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
a690: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65  lock of code che
a6a0: 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65  cks early to see
a6b0: 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e   if a cell exten
a6c0: 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  ds.    ** past t
a6d0: 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65  he end of a page
a6e0: 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61   boundary and ca
a6f0: 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  uses SQLITE_CORR
a700: 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  UPT to be .    *
a710: 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74  * returned if it
a720: 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 23 69   does..    */.#i
a730: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
a740: 5f 45 4e 41 42 4c 45 5f 4f 56 45 52 53 49 5a 45  _ENABLE_OVERSIZE
a750: 5f 43 45 4c 4c 5f 43 48 45 43 4b 29 0a 20 20 20  _CELL_CHECK).   
a760: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65   {.      int iCe
a770: 6c 6c 46 69 72 73 74 3b 20 20 20 2f 2a 20 46 69  llFirst;   /* Fi
a780: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
a790: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  ll index */.    
a7a0: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
a7b0: 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73      /* Last poss
a7c0: 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  ible cell index 
a7d0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20  */.      int i; 
a7e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
a7f0: 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
a800: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
a810: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  */.      int sz;
a820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a830: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
a840: 0a 20 20 20 20 20 20 69 43 65 6c 6c 46 69 72 73  .      iCellFirs
a850: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
a860: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
a870: 0a 20 20 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  .      iCellLast
a880: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
a890: 34 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  4;.      if( !pP
a8a0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
a8b0: 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 20 20 66  lLast--;.      f
a8c0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
a8d0: 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
a8e0: 20 20 20 20 20 20 70 63 20 3d 20 67 65 74 32 62        pc = get2b
a8f0: 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  yte(&data[cellOf
a900: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
a910: 20 20 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c      if( pc<iCell
a920: 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c  First || pc>iCel
a930: 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20  lLast ){.       
a940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a950: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
a960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a970: 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74   sz = cellSizePt
a980: 72 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70  r(pPage, &data[p
a990: 63 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c]);.        if(
a9a0: 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a   pc+sz>usableSiz
a9b0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
a9c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
a9d0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
a9e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a9f0: 20 7d 20 20 0a 23 65 6e 64 69 66 0a 0a 20 20 20   }  .#endif..   
aa00: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
aa10: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
aa20: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
aa30: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
aa40: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
aa50: 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74  .    nFree = dat
aa60: 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 0a  a[hdr+7] + top;.
aa70: 20 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20      while( pc>0 
aa80: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78  ){.      u16 nex
aa90: 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69  t, size;.      i
aaa0: 66 28 20 70 63 3e 75 73 61 62 6c 65 53 69 7a 65  f( pc>usableSize
aab0: 2d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  -4 ){.        /*
aac0: 20 46 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 6f   Free block is o
aad0: 66 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  ff the page */. 
aae0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
aaf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
ab00: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
ab10: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
ab20: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
ab30: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
ab40: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
ab50: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
ab60: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
ab70: 69 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 20  ize+3 ){.       
ab80: 20 2f 2a 20 46 72 65 65 20 62 6c 6f 63 6b 73 20   /* Free blocks 
ab90: 6d 75 73 74 20 62 65 20 69 6e 20 61 63 63 65 6e  must be in accen
aba0: 64 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ding order */.  
abb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
abc0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
abd0: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
abe0: 20 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2b   nFree = nFree +
abf0: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
ac00: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 20  = next;.    }.. 
ac10: 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
ac20: 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e 74 61  int, nFree conta
ac30: 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74  ins the sum of t
ac40: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
ac50: 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 6f 66   start.    ** of
ac60: 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
ac70: 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
ac80: 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
ac90: 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 20 20  ytes within.    
aca0: 2a 2a 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  ** the cell-cont
acb0: 65 6e 74 20 61 72 65 61 2e 20 49 66 20 74 68 69  ent area. If thi
acc0: 73 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  s is greater tha
acd0: 6e 20 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a  n the usable-siz
ace0: 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  e.    ** of the 
acf0: 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 70  page, then the p
ad00: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
ad10: 75 70 74 65 64 2e 20 54 68 69 73 20 63 68 65 63  upted. This chec
ad20: 6b 20 61 6c 73 6f 0a 20 20 20 20 2a 2a 20 73 65  k also.    ** se
ad30: 72 76 65 73 20 74 6f 20 76 65 72 69 66 79 20 74  rves to verify t
ad40: 68 61 74 20 74 68 65 20 6f 66 66 73 65 74 20 74  hat the offset t
ad50: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
ad60: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a  he cell-content.
ad70: 20 20 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63      ** area, acc
ad80: 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
ad90: 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
ada0: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
adb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
adc0: 6e 46 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65  nFree>usableSize
add0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
ade0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
adf0: 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20  BKPT; .    }.   
ae00: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
ae10: 6e 46 72 65 65 20 2d 20 28 63 65 6c 6c 4f 66 66  nFree - (cellOff
ae20: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
ae30: 43 65 6c 6c 29 3b 0a 0a 23 69 66 20 30 0a 20 20  Cell);..#if 0.  
ae40: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 61 6c  /* Check that al
ae50: 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20 69 6e  l the offsets in
ae60: 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73 65 74   the cell offset
ae70: 20 61 72 72 61 79 20 61 72 65 20 77 69 74 68 69   array are withi
ae80: 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a  n range. .  ** .
ae90: 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20 74 68    ** Omitting th
aea0: 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 63  is consistency c
aeb0: 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67 20 74  heck and using t
aec0: 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  he pPage->maskPa
aed0: 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74 6f 20  ge mask.  ** to 
aee0: 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75 6e 6e  prevent overrunn
aef0: 69 6e 67 20 74 68 65 20 70 61 67 65 20 62 75 66  ing the page buf
af00: 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c 6c 28  fer in findCell(
af10: 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61 0a 20  ) results in a. 
af20: 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f 72 6d   ** 2.5% perform
af30: 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a  ance gain..  */.
af40: 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f 66 66    {.    u8 *pOff
af50: 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72  ;        /* Iter
af60: 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63 68 65  ator used to che
af70: 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66 66 73  ck all cell offs
af80: 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e 67 65  ets are in range
af90: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   */.    u8 *pEnd
afa0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ;        /* Poin
afb0: 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20 63 65  ter to end of ce
afc0: 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20  ll offset array 
afd0: 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b 3b 20  */.    u8 mask; 
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
aff0: 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d 75 73  of bits that mus
b000: 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d 53 42  t be zero in MSB
b010: 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74 73   of cell offsets
b020: 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d 20 7e   */.    mask = ~
b030: 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65  (((u8)(pBt->page
b040: 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20  Size>>8))-1);.  
b050: 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63    pEnd = &data[c
b060: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50 61 67  ellOffset + pPag
b070: 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20  e->nCell*2];.   
b080: 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74 61 5b   for(pOff=&data[
b090: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70 4f 66  cellOffset]; pOf
b0a0: 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28 2a 70  f!=pEnd && !((*p
b0b0: 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f 66 66  Off)&mask); pOff
b0c0: 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  +=2);.    if( pO
b0d0: 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  ff!=pEnd ){.    
b0e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b0f0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
b100: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
b110: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
b120: 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 1;.  }.  ret
b130: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b140: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
b150: 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
b160: 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
b170: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
b180: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
b190: 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
b1a0: 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
b1b0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b1c0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
b1d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
b1e0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b1f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
b200: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
b210: 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
b220: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
b230: 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
b240: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b250: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
b260: 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
b270: 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
b280: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
b290: 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
b2a0: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
b2b0: 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
b2c0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
b2d0: 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
b2e0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
b2f0: 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
b300: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
b310: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
b320: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
b330: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b340: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
b350: 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65  ex) );.  /*memse
b360: 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c  t(&data[hdr], 0,
b370: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
b380: 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74   - hdr);*/.  dat
b390: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
b3a0: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
b3b0: 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66 6c  hdr + 8 + 4*((fl
b3c0: 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30  ags&PTF_LEAF)==0
b3d0: 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73 65 74   ?1:0);.  memset
b3e0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
b3f0: 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  , 4);.  data[hdr
b400: 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62  +7] = 0;.  put2b
b410: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
b420: 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
b430: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  e);.  pPage->nFr
b440: 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ee = pBt->usable
b450: 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a 20 20  Size - first;.  
b460: 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
b470: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
b480: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
b490: 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  hdr;.  pPage->ce
b4a0: 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74  llOffset = first
b4b0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
b4c0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65  flow = 0;.  asse
b4d0: 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  rt( pBt->pageSiz
b4e0: 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70  e>=512 && pBt->p
b4f0: 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20 29  ageSize<=32768 )
b500: 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ;.  pPage->maskP
b510: 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  age = pBt->pageS
b520: 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67 65  ize - 1;.  pPage
b530: 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
b540: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
b550: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
b560: 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
b570: 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
b580: 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
b590: 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
b5a0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
b5b0: 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
b5c0: 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
b5d0: 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
b5e0: 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
b5f0: 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
b600: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
b610: 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
b620: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
b630: 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
b640: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20   pPage->aData = 
b650: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
b660: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
b670: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
b680: 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50 61 67   pDbPage;.  pPag
b690: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
b6a0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
b6b0: 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72  no;.  pPage->hdr
b6c0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b6d0: 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
b6e0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  0;.  return pPag
b6f0: 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e; .}../*.** Get
b700: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
b710: 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c   pager.  Initial
b720: 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e  ize the MemPage.
b730: 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61  pBt and.** MemPa
b740: 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74  ge.aData element
b750: 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  s if needed..**.
b760: 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e 74  ** If the noCont
b770: 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ent flag is set,
b780: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
b790: 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
b7a0: 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  out.** the conte
b7b0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 61  nt of the page a
b7c0: 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53 6f  t this time.  So
b7d0: 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74 68   do not go to th
b7e0: 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65 74  e disk.** to fet
b7f0: 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 20  ch the content. 
b800: 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74 68   Just fill in th
b810: 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a  e content with z
b820: 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a 2a  eros for now..**
b830: 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75 72   If in the futur
b840: 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74 65  e we call sqlite
b850: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e  3PagerWrite() on
b860: 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61 74   this page, that
b870: 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61 76  .** means we hav
b880: 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65 20  e started to be 
b890: 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74 20  concerned about 
b8a0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
b8b0: 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68 6f  disk.** read sho
b8c0: 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
b8d0: 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
b8e0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
b8f0: 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
b900: 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
b910: 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
b920: 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
b930: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b940: 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
b950: 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
b960: 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
b970: 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
b980: 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
b990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74   */.  int noCont
b9a0: 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  ent        /* Do
b9b0: 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20 63   not load page c
b9c0: 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20 2a  ontent if true *
b9d0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
b9e0: 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
b9f0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
ba00: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
ba10: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
ba20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
ba30: 65 72 41 63 71 75 69 72 65 28 70 42 74 2d 3e 70  erAcquire(pBt->p
ba40: 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
ba50: 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
ba60: 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69   noContent);.  i
ba70: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
ba80: 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62  c;.  *ppPage = b
ba90: 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
baa0: 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
bab0: 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e  , pBt);.  return
bac0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
bad0: 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20  *.** Retrieve a 
bae0: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61  page from the pa
baf0: 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
bb00: 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
bb10: 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61   is not.** alrea
bb20: 64 79 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  dy in the pager 
bb30: 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e 55 4c  cache return NUL
bb40: 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  L. Initialize th
bb50: 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
bb60: 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
bb70: 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
bb80: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
bb90: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
bba0: 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68 61 72  ageLookup(BtShar
bbb0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
bbc0: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
bbd0: 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  DbPage;.  assert
bbe0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bbf0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
bc00: 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20 3d 20   );.  pDbPage = 
bc10: 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
bc20: 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  up(pBt->pPager, 
bc30: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 44 62  pgno);.  if( pDb
bc40: 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
bc50: 72 6e 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d  rn btreePageFrom
bc60: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
bc70: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 7d 0a  pgno, pBt);.  }.
bc80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bc90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
bca0: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
bcb0: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
bcc0: 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
bcd0: 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65  any kind of.** e
bce0: 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28 28 75  rror, return ((u
bcf0: 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31 29 2e  nsigned int)-1).
bd00: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20  .*/.static Pgno 
bd10: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 42  pagerPagecount(B
bd20: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
bd30: 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d 31 3b   int nPage = -1;
bd40: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
bd50: 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ert( pBt->pPage1
bd60: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
bd70: 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
bd80: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e  (pBt->pPager, &n
bd90: 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
bda0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
bdb0: 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b 0a 20  | nPage==-1 );. 
bdc0: 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29 6e 50   return (Pgno)nP
bdd0: 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  age;.}../*.** Ge
bde0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
bdf0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
be00: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
be10: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
be20: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
be30: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
be40: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
be50: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
be60: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
be70: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
be80: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
be90: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
bea0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
beb0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
bec0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
bed0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
bee0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
bef0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
bf00: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
bf10: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
bf20: 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e     /* Write t
bf30: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
bf40: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
bf50: 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
bf60: 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
bf70: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
bf80: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
bf90: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d   );.  if( pgno==
bfa0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
bfb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
bfc0: 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f 2a 20  KPT; .  }..  /* 
bfd0: 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68 65 20  It is often the 
bfe0: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 70 61  case that the pa
bff0: 67 65 20 77 65 20 77 61 6e 74 20 69 73 20 61 6c  ge we want is al
c000: 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 0a  ready in cache..
c010: 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65 74 20    ** If so, get 
c020: 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  it directly.  Th
c030: 69 73 20 73 61 76 65 73 20 75 73 20 66 72 6f 6d  is saves us from
c040: 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c 6c 0a   having to call.
c050: 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65 63 6f    ** pagerPageco
c060: 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20 73 75  unt() to make su
c070: 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74 68 69  re pgno is withi
c080: 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63 68 20  n limits, which 
c090: 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69 6e 20  results.  ** in 
c0a0: 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 70 65  a measureable pe
c0b0: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
c0c0: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 2a  ements..  */.  *
c0d0: 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 20 3d  ppPage = pPage =
c0e0: 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
c0f0: 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  (pBt, pgno);.  i
c100: 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
c110: 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72 65 61  /* Page is alrea
c120: 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  dy in cache */. 
c130: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c140: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
c150: 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e 20 63  /* Page not in c
c160: 61 63 68 65 2e 20 20 41 63 71 75 69 72 65 20 69  ache.  Acquire i
c170: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67  t. */.    if( pg
c180: 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
c190: 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
c1a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c1b0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
c1c0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
c1d0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
c1e0: 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
c1f0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
c200: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
c210: 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70 50 61     pPage = *ppPa
c220: 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ge;.  }.  if( !p
c230: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
c240: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c250: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
c260: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  age);.  }.  if( 
c270: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c280: 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
c290: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 70  (pPage);.    *pp
c2a0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
c2b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
c2c0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65  .** Release a Me
c2d0: 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f  mPage.  This sho
c2e0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  uld be called on
c2f0: 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f  ce for each prio
c300: 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c  r.** call to sql
c310: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
c320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c330: 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
c340: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
c350: 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
c360: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c370: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
c380: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
c390: 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e  Refcount(pPage->
c3a0: 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a 20 20  pDbPage)>1 );.  
c3b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c3c0: 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
c3d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
c3e0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
c3f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
c400: 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
c410: 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
c420: 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Page );.    asse
c430: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c440: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
c450: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
c460: 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73  aData );.    ass
c470: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c480: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c490: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c4a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
c4b0: 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ref(pPage->pDbPa
c4c0: 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
c4d0: 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  * During a rollb
c4e0: 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61  ack, when the pa
c4f0: 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f  ger reloads info
c500: 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65  rmation into the
c510: 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61   cache.** so tha
c520: 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72  t the cache is r
c530: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
c540: 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74  riginal state at
c550: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
c560: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c570: 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  , for each page 
c580: 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f  restored this ro
c590: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
c5a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
c5b0: 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73  ine needs to res
c5c0: 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74  et the extra dat
c5d0: 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65  a section at the
c5e0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70   end of the.** p
c5f0: 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74  age to agree wit
c600: 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64  h the restored d
c610: 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ata..*/.static v
c620: 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44  oid pageReinit(D
c630: 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20  bPage *pData){. 
c640: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
c650: 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  .  pPage = (MemP
c660: 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67  age *)sqlite3Pag
c670: 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74 61  erGetExtra(pData
c680: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
c690: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
c6a0: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29  count(pData)>0 )
c6b0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
c6c0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73  sInit ){.    ass
c6d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c6e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c6f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c700: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
c710: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
c720: 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
c730: 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29  count(pData)>1 )
c740: 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65  {.      /* pPage
c750: 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20   might not be a 
c760: 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74 20  btree page;  it 
c770: 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72  might be an over
c780: 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20  flow page.      
c790: 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67  ** or ptrmap pag
c7a0: 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67 65  e or a free page
c7b0: 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65  .  In those case
c7c0: 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  s, the following
c7d0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74  .      ** call t
c7e0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  o sqlite3BtreeIn
c7f0: 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
c800: 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
c810: 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
c820: 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
c830: 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
c840: 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
c850: 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
c860: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  .      ** sqlite
c870: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
c880: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
c890: 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
c8a0: 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
c8b0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
c8c0: 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
c8d0: 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
c8e0: 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
c8f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
c900: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
c910: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
c920: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
c930: 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
c940: 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
c950: 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
c960: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
c970: 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
c980: 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
c990: 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
c9a0: 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
c9b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c9c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
c9d0: 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
c9e0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
c9f0: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ca00: 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
ca10: 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
ca20: 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
ca30: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
ca40: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
ca50: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
ca60: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
ca70: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
ca80: 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61 74 61  LL.** a new data
ca90: 62 61 73 65 20 77 69 74 68 20 61 20 72 61 6e 64  base with a rand
caa0: 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65 61 74  om name is creat
cab0: 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64 6f 6d  ed.  This random
cac0: 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61 74 61  ly named.** data
cad0: 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62  base file will b
cae0: 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 73  e deleted when s
caf0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
cb00: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
cb10: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
cb20: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
cb30: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
cb40: 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65  tabase is create
cb50: 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74  d.** that is aut
cb60: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72  omatically destr
cb70: 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  oyed when it is 
cb80: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
cb90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
cba0: 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
cbb0: 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
cbc0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
cbd0: 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e  ** and we are in
cbe0: 20 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f   shared cache mo
cbf0: 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65  de, then the ope
cc00: 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68  n will fail with
cc10: 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f   an.** SQLITE_CO
cc20: 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20  NSTRAINT error. 
cc30: 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   We cannot allow
cc40: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53   two or more BtS
cc50: 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73  hared.** objects
cc60: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
cc70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
cc80: 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
cc90: 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20  will lead.** to 
cca0: 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f  problems with lo
ccb0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
ccc0: 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a  lite3BtreeOpen(.
ccd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
cce0: 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
ccf0: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
cd00: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
cd10: 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
cd20: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
cd40: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
cd50: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
cd60: 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
cd70: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
cd80: 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
cd90: 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
cda0: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cdc0: 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
cdd0: 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
cde0: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
cdf0: 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
ce00: 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
ce10: 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  n() */.){.  sqli
ce20: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
ce30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
ce40: 65 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  e VFS to use for
ce50: 20 74 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20   this btree */. 
ce60: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
ce70: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ce80: 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
ce90: 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
cea0: 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
ceb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cec0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
ced0: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
cee0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
cef0: 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
cf00: 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
cf10: 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
cf20: 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
cf30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
cf40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
cf50: 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
cf60: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
cf70: 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
cfa0: 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
cfb0: 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
cfc0: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
cfd0: 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
cfe0: 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
cff0: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
d000: 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
d010: 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
d020: 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
d030: 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
d040: 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
d050: 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
d060: 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f  base. This symbo
d070: 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72  l is only requir
d080: 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65  ed if.  ** eithe
d090: 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d  r of the shared-
d0a0: 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75  data or autovacu
d0b0: 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65 20  um features are 
d0c0: 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69  compiled .  ** i
d0d0: 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e  nto the library.
d0e0: 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  .  */.#if !defin
d0f0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
d100: 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20  HARED_CACHE) || 
d110: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d120: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29  OMIT_AUTOVACUUM)
d130: 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54 45  .  #ifdef SQLITE
d140: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
d150: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
d160: 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73  emdb = 0;.  #els
d170: 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
d180: 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e  isMemdb = zFilen
d190: 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a  ame && !strcmp(z
d1a0: 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
d1b0: 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a  ry:");.  #endif.
d1c0: 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
d1d0: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
d1e0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
d1f0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
d200: 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20  x) );..  pVfs = 
d210: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20  db->pVfs;.  p = 
d220: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
d230: 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29  o(sizeof(Btree))
d240: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
d250: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d260: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e  NOMEM;.  }.  p->
d270: 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
d280: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
d290: 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
d2a0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
d2b0: 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
d2c0: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
d2d0: 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
d2e0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
d2f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d300: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
d310: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
d320: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
d330: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
d340: 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
d350: 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
d360: 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
d370: 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
d380: 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
d390: 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
d3a0: 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
d3b0: 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 3d  /.  if( isMemdb=
d3c0: 3d 30 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20  =0 && zFilename 
d3d0: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20  && zFilename[0] 
d3e0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
d3f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
d400: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
d410: 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  d ){.      int n
d420: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70  FullPathname = p
d430: 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
d440: 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  1;.      char *z
d450: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
d460: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75  qlite3Malloc(nFu
d470: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
d480: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
d490: 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20   *mutexShared;. 
d4a0: 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
d4b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e   = 1;.      db->
d4c0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
d4d0: 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20  SharedCache;.   
d4e0: 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74     if( !zFullPat
d4f0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
d500: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
d510: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
d520: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d530: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d540: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
d550: 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
d560: 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  me, nFullPathnam
d570: 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e, zFullPathname
d580: 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  );.      mutexOp
d590: 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
d5a0: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
d5b0: 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
d5c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d5d0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
d5e0: 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
d5f0: 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
d600: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
d610: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
d620: 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
d630: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d640: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
d650: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74  );.      for(pBt
d660: 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64  =GLOBAL(BtShared
d670: 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
d680: 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20  acheList); pBt; 
d690: 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b  pBt=pBt->pNext){
d6a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d6b0: 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pBt->nRef>0 );.
d6c0: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
d6d0: 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e  trcmp(zFullPathn
d6e0: 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65  ame, sqlite3Page
d6f0: 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70  rFilename(pBt->p
d700: 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
d710: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
d720: 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d  te3PagerVfs(pBt-
d730: 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29  >pPager)==pVfs )
d740: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
d750: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66  iDb;.          f
d760: 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31  or(iDb=db->nDb-1
d770: 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29  ; iDb>=0; iDb--)
d780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74  {.            Bt
d790: 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d  ree *pExisting =
d7a0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
d7b0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  t;.            i
d7c0: 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20  f( pExisting && 
d7d0: 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d  pExisting->pBt==
d7e0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
d7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
d800: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
d810: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ared);.         
d820: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
d830: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
d840: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  en);.           
d850: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d860: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
d880: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
d8a0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
d8b0: 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20  RAINT;.         
d8c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
d8d0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42  .          p->pB
d8e0: 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20  t = pBt;.       
d8f0: 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a     pBt->nRef++;.
d900: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d910: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d920: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
d930: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
d940: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
d950: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
d960: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
d970: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
d980: 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65  E_DEBUG.    else
d990: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65  {.      /* In de
d9a0: 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72  bug mode, we mar
d9b0: 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74  k all persistent
d9c0: 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68   databases as sh
d9d0: 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  arable.      ** 
d9e0: 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61  even when they a
d9f0: 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78  re not.  This ex
da00: 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b  ercises the lock
da10: 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20  ing code and.   
da20: 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65     ** gives more
da30: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72   opportunity for
da40: 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33   asserts(sqlite3
da50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20  _mutex_held()). 
da60: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
da70: 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69  ts to find locki
da80: 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20  ng problems..   
da90: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73     */.      p->s
daa0: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
dab0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65   }.#endif.  }.#e
dac0: 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d  ndif.  if( pBt==
dad0: 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  0 ){.    /*.    
dae0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
daf0: 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75   asserts make su
db00: 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72  re that structur
db10: 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62  es used by the b
db20: 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  tree are.    ** 
db30: 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20  the right size. 
db40: 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72   This is to guar
db50: 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63  d against size c
db60: 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75  hanges that resu
db70: 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63  lt.    ** when c
db80: 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69  ompiling on a di
db90: 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63  fferent architec
dba0: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
dbb0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dbc0: 69 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  i64)==8 || sizeo
dbd0: 66 28 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(i64)==4 );.   
dbe0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dbf0: 75 36 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f  u64)==8 || sizeo
dc00: 66 28 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20  f(u64)==4 );.   
dc10: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
dc20: 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
dc30: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
dc40: 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
dc50: 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
dc60: 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
dc70: 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
dc80: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
dc90: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
dca0: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
dcb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
dcc0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  M;.      goto bt
dcd0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
dce0: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
dcf0: 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
dd00: 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
dd10: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
dd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd30: 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
dd40: 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
dd50: 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  gs);.    if( rc=
dd60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
dd70: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
dd80: 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
dd90: 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
dda0: 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
ddb0: 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
ddc0: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
ddd0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
dde0: 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
ddf0: 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
de00: 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
de10: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
de20: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
de30: 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
de40: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
de50: 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
de60: 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
de70: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
de80: 65 74 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e  etReiniter(pBt->
de90: 70 50 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e  pPager, pageRein
dea0: 69 74 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43  it);.    pBt->pC
deb0: 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70  ursor = 0;.    p
dec0: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
ded0: 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
dee0: 79 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  y = sqlite3Pager
def0: 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
df00: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
df10: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74  ->pageSize = get
df20: 32 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72  2byte(&zDbHeader
df30: 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  [16]);.    if( p
df40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
df50: 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
df60: 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
df70: 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
df80: 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
df90: 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
dfa0: 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
dfb0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
dfc0: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
dfd0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
dfe0: 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
dff0: 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
e000: 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
e010: 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
e020: 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
e030: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
e040: 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
e050: 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
e060: 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
e070: 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
e080: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
e090: 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
e0a0: 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
e0b0: 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
e0c0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
e0d0: 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
e0e0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
e0f0: 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
e100: 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
e110: 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
e120: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
e130: 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
e140: 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
e150: 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
e160: 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
e170: 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
e180: 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
e190: 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
e1a0: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
e1b0: 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
e1c0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
e1d0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
e1e0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
e1f0: 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
e200: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
e210: 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
e220: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
e230: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
e240: 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
e250: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
e260: 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e  eFixed = 1;.#ifn
e270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e280: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
e290: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
e2a0: 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44   = (get4byte(&zD
e2b0: 62 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34  bHeader[36 + 4*4
e2c0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70  ])?1:0);.      p
e2d0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
e2e0: 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48   (get4byte(&zDbH
e2f0: 65 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29  eader[36 + 7*4])
e300: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
e310: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
e320: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
e330: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
e340: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
e350: 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20  , nReserve);.   
e360: 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
e370: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
e380: 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
e390: 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
e3a0: 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20  ze - nReserve;. 
e3b0: 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d     assert( (pBt-
e3c0: 3e 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  >pageSize & 7)==
e3d0: 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20  0 );  /* 8-byte 
e3e0: 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67  alignment of pag
e3f0: 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66  eSize */.   .#if
e400: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e410: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
e420: 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
e430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
e440: 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74  IO).    /* Add t
e450: 68 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20  he new BtShared 
e460: 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69  object to the li
e470: 6e 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62  nked list sharab
e480: 6c 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20  le BtShareds..  
e490: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
e4a0: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
e4b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
e4c0: 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20  *mutexShared;.  
e4d0: 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20      pBt->nRef = 
e4e0: 31 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68  1;.      mutexSh
e4f0: 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75  ared = sqlite3Mu
e500: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
e510: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
e520: 54 45 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TER);.      if( 
e530: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
e540: 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
e550: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
e560: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
e570: 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
e580: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
e590: 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
e5a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
e5b0: 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
e5c0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
e5d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
e5e0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
e5f0: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  Failed = 0;.    
e600: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
e610: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20  _open_out;.     
e620: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
e630: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
e640: 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72  _enter(mutexShar
e650: 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ed);.      pBt->
e660: 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42  pNext = GLOBAL(B
e670: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
e680: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
e690: 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42  ;.      GLOBAL(B
e6a0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
e6b0: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
e6c0: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71   = pBt;.      sq
e6d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e6e0: 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  e(mutexShared);.
e6f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e700: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
e710: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
e720: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
e730: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
e740: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66  _DISKIO).  /* If
e750: 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75   the new Btree u
e760: 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70  ses a sharable p
e770: 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c  BtShared, then l
e780: 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a  ink the new.  **
e790: 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20   Btree into the 
e7a0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72  list of all shar
e7b0: 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20  able Btrees for 
e7c0: 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74  the same connect
e7d0: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69  ion..  ** The li
e7e0: 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73  st is kept in as
e7f0: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
e800: 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20   pBt address..  
e810: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  */.  if( p->shar
e820: 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  able ){.    int 
e830: 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53  i;.    Btree *pS
e840: 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ib;.    for(i=0;
e850: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
e860: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69  {.      if( (pSi
e870: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  b = db->aDb[i].p
e880: 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e  Bt)!=0 && pSib->
e890: 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
e8a0: 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d      while( pSib-
e8b0: 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d  >pPrev ){ pSib =
e8c0: 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a   pSib->pPrev; }.
e8d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
e8e0: 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a  Bt<pSib->pBt ){.
e8f0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65            p->pNe
e900: 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  xt = pSib;.     
e910: 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
e920: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69  0;.          pSi
e930: 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  b->pPrev = p;.  
e940: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e950: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
e960: 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69  ib->pNext && pSi
e970: 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d  b->pNext->pBt<p-
e980: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
e990: 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d      pSib = pSib-
e9a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
e9b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
e9c0: 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70  >pNext = pSib->p
e9d0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
e9e0: 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b  p->pPrev = pSib;
e9f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
ea00: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
ea10: 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d         p->pNext-
ea20: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
ea30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ea40: 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20    pSib->pNext = 
ea50: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
ea60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ea70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
ea80: 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20  ndif.  *ppBtree 
ea90: 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e  = p;..btree_open
eaa0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
eab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
eac0: 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d   if( pBt && pBt-
ead0: 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20  >pPager ){.     
eae0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
eaf0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
eb00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
eb10: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
eb20: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
eb30: 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
eb40: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d  = 0;.  }.  if( m
eb50: 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  utexOpen ){.    
eb60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
eb70: 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65 78  mutex_held(mutex
eb80: 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c  Open) );.    sql
eb90: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
eba0: 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d  (mutexOpen);.  }
ebb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ebc0: 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
ebd0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
ebe0: 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
ebf0: 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
ec00: 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
ec10: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
ec20: 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
ec30: 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
ec40: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
ec50: 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
ec60: 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
ec70: 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
ec80: 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
ec90: 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
eca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ecb0: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
ecc0: 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
ecd0: 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
ece0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
ecf0: 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33  _CACHE.  sqlite3
ed00: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
ed10: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69  .  BtShared *pLi
ed20: 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65  st;.  int remove
ed30: 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  d = 0;..  assert
ed40: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
ed50: 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  notheld(pBt->mut
ed60: 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72  ex) );.  pMaster
ed70: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
ed80: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
ed90: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
eda0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
edb0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
edc0: 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pBt->nRef--;
edd0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66  .  if( pBt->nRef
ede0: 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47  <=0 ){.    if( G
edf0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
ee00: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
ee10: 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a  heList)==pBt ){.
ee20: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
ee30: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
ee40: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
ee50: 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pBt->pNext;.   
ee60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
ee70: 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ist = GLOBAL(BtS
ee80: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
ee90: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
eea0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57        while( ALW
eeb0: 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c  AYS(pList) && pL
eec0: 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20  ist->pNext!=pBt 
eed0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
eee0: 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20  =pList->pNext;. 
eef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ef00: 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29   ALWAYS(pList) )
ef10: 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d  {.        pList-
ef20: 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e  >pNext = pBt->pN
ef30: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
ef40: 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54   }.    if( SQLIT
ef50: 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a  E_THREADSAFE ){.
ef60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
ef70: 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75  tex_free(pBt->mu
ef80: 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
ef90: 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d  removed = 1;.  }
efa0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
efb0: 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b  _leave(pMaster);
efc0: 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65  .  return remove
efd0: 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  d;.#else.  retur
efe0: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 1;.#endif.}../
eff0: 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70  *.** Make sure p
f000: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f  Bt->pTmpSpace po
f010: 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63  ints to an alloc
f020: 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f  ation of .** MX_
f030: 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62  CELL_SIZE(pBt) b
f040: 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ytes..*/.static 
f050: 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d  void allocateTem
f060: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
f070: 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42  *pBt){.  if( !pB
f080: 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
f090: 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
f0a0: 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ce = sqlite3Page
f0b0: 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67  Malloc( pBt->pag
f0c0: 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  eSize );.  }.}..
f0d0: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
f0e0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
f0f0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
f100: 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
f110: 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
f120: 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pBt){.  sqlite3P
f130: 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54  ageFree( pBt->pT
f140: 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d  mpSpace);.  pBt-
f150: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
f160: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
f170: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
f180: 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61  and invalidate a
f190: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69  ll cursors..*/.i
f1a0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
f1b0: 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  lose(Btree *p){.
f1c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
f1d0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75  = p->pBt;.  BtCu
f1e0: 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f  rsor *pCur;..  /
f1f0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
f200: 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74  ors opened via t
f210: 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a  his handle.  */.
f220: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f230: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
f240: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
f250: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
f260: 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  r(p);.  pCur = p
f270: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
f280: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
f290: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
f2a0: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
f2b0: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
f2c0: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
f2d0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
f2e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
f2f0: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
f300: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
f310: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
f320: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
f330: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
f340: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
f350: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
f360: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
f370: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
f380: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
f390: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
f3a0: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
f3b0: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
f3c0: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
f3d0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
f3e0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
f3f0: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
f400: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
f410: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
f420: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
f430: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
f440: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
f450: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
f460: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
f470: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
f480: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
f490: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
f4a0: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
f4b0: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
f4c0: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
f4d0: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
f4e0: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
f4f0: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
f500: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
f510: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
f520: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
f530: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
f540: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
f550: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
f560: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
f570: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
f580: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
f590: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
f5a0: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
f5b0: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
f5c0: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
f5d0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
f5e0: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
f5f0: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
f600: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
f610: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
f620: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
f630: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
f640: 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
f650: 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ma);.    freeTem
f660: 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
f670: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
f680: 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  t);.  }..#ifndef
f690: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
f6a0: 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65  RED_CACHE.  asse
f6b0: 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
f6c0: 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  k==0 );.  assert
f6d0: 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  ( p->locked==0 )
f6e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
f6f0: 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65   ) p->pPrev->pNe
f700: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
f710: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20   if( p->pNext ) 
f720: 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
f730: 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64  = p->pPrev;.#end
f740: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  if..  sqlite3_fr
f750: 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(p);.  return 
f760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f770: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
f780: 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
f790: 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f  er of pages allo
f7a0: 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  wed in the cache
f7b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
f7c0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  mum number of ca
f7d0: 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74  che pages is set
f7e0: 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65   to the absolute
f7f0: 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  .** value of mxP
f800: 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20  age.  If mxPage 
f810: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65  is negative, the
f820: 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f   pager will.** o
f830: 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e  perate asynchron
f840: 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20  ously - it will 
f850: 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66  not stop to do f
f860: 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e  sync()s.** to in
f870: 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69  sure data is wri
f880: 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b  tten to the disk
f890: 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a   surface before.
f8a0: 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20  ** continuing.  
f8b0: 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69  Transactions sti
f8c0: 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68  ll work if synch
f8d0: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a  ronous is off,.*
f8e0: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
f8f0: 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72  se cannot be cor
f900: 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70  rupted if this p
f910: 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65  rogram.** crashe
f920: 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f  s.  But if the o
f930: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
f940: 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65  crashes or there
f950: 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74   is.** an abrupt
f960: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77   power failure w
f970: 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  hen synchronous 
f980: 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61  is off, the data
f990: 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65  base.** could be
f9a0: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
f9b0: 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72  nsistent and unr
f9c0: 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65  ecoverable state
f9d0: 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73  ..** Synchronous
f9e0: 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
f9f0: 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f  t so database co
fa00: 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  rruption is not.
fa10: 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f  ** normally a wo
fa20: 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  rry..*/.int sqli
fa30: 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
fa40: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
fa50: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
fa60: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
fa70: 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
fa80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
fa90: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
faa0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
fab0: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
fac0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
fad0: 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
fae0: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
faf0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
fb00: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
fb10: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fb20: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79  * Change the way
fb30: 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20   data is synced 
fb40: 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72  to disk in order
fb50: 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20   to increase or 
fb60: 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20  decrease.** how 
fb70: 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73  well the databas
fb80: 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65  e resists damage
fb90: 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
fba0: 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20  es and power.** 
fbb0: 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c  failures.  Level
fbc0: 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61   1 is the same a
fbd0: 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28  s asynchronous (
fbe0: 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72  no syncs() occur
fbf0: 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73   and.** there is
fc00: 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c   a high probabil
fc10: 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20  ity of damage)  
fc20: 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64  Level 2 is the d
fc30: 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a  efault.  There.*
fc40: 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20  * is a very low 
fc50: 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f  but non-zero pro
fc60: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
fc70: 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64  ge.  Level 3 red
fc80: 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62  uces the.** prob
fc90: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
fca0: 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62  e to near zero b
fcb0: 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20  ut with a write 
fcc0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
fcd0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ction..*/.#ifnde
fce0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
fcf0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20  GER_PRAGMAS.int 
fd00: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
fd10: 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65  afetyLevel(Btree
fd20: 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20   *p, int level, 
fd30: 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20  int fullSync){. 
fd40: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
fd50: 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
fd60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
fd70: 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
fd80: 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
fd90: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
fda0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fdb0: 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d  SafetyLevel(pBt-
fdc0: 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20  >pPager, level, 
fdd0: 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
fde0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
fdf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fe00: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
fe10: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
fe20: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
fe30: 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  btree is set to 
fe40: 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20  safety level 1. 
fe50: 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72   In other.** wor
fe60: 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
fe70: 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63  if no sync() occ
fe80: 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  urs on the disk 
fe90: 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  files..*/.int sq
fea0: 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
feb0: 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29  sabled(Btree *p)
fec0: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
fed0: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
fee0: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
fef0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ff00: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
ff10: 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42   );  .  sqlite3B
ff20: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
ff30: 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70  assert( pBt && p
ff40: 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20  Bt->pPager );.  
ff50: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ff60: 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61  rNosync(pBt->pPa
ff70: 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ger);.  sqlite3B
ff80: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
ff90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
ffa0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
ffb0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
ffc0: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
ffd0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
ffe0: 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  CUUM)./*.** Chan
fff0: 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ge the default p
10000 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68  ages size and th
10010 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
10020 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70  rved bytes per p
10030 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  age..** Or, if t
10040 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61 73  he page size has
10050 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69   already been fi
10060 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  xed, return SQLI
10070 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20  TE_READONLY .** 
10080 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
10090 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a   anything..**.**
100a0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
100b0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
100c0 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32 20  f 2 between 512 
100d0 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20 74  and 65536.  If t
100e0 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  he page.** size 
100f0 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f  supplied does no
10100 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73  t meet this cons
10110 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20  traint then the 
10120 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
10130 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  .** changed..**.
10140 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61 72  ** Page sizes ar
10150 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f  e constrained to
10160 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74   be a power of t
10170 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  wo so that the r
10180 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  egion.** of the 
10190 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
101a0 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28  ed for locking (
101b0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e  beginning at PEN
101c0 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68  DING_BYTE,.** th
101d0 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61 73  e first byte pas
101e0 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61  t the 1GB bounda
101f0 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29 20  ry, 0x40000000) 
10200 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a  needs to occur.*
10210 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  * at the beginni
10220 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a  ng of a page..**
10230 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
10240 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65 73   nReserve is les
10250 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
10260 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
10270 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65  reserved.** byte
10280 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c 65  s per page is le
10290 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  ft unchanged..**
102a0 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78 21  .** If the iFix!
102b0 3d 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  =0 then the page
102c0 53 69 7a 65 46 69 78 65 64 20 66 6c 61 67 20 69  SizeFixed flag i
102d0 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68  s set so that th
102e0 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61  e page size.** a
102f0 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f  nd autovacuum mo
10300 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  de can no longer
10310 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
10320 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
10330 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  SetPageSize(Btre
10340 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69  e *p, int pageSi
10350 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65  ze, int nReserve
10360 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69  , int iFix){.  i
10370 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10380 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
10390 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
103a0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
103b0 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c  =-1 && nReserve<
103c0 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  =255 );.  sqlite
103d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
103e0 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
103f0 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
10400 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10410 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
10420 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
10430 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
10440 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
10450 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
10460 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
10470 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
10480 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
10490 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
104a0 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
104b0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
104c0 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
104d0 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
104e0 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
104f0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
10500 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
10510 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
10520 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
10530 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
10540 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
10550 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
10560 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61  geSize = (u16)pa
10570 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
10580 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
10590 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
105a0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
105b0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
105c0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
105d0 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
105e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
105f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
10600 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
10610 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
10620 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
10630 31 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  1;.  sqlite3Btre
10640 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10650 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
10660 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
10670 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61  ently defined pa
10680 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ge size.*/.int s
10690 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
106a0 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29  geSize(Btree *p)
106b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
106c0 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a  t->pageSize;.}..
106d0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
106e0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
106f0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
10700 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
10710 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
10720 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
10730 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
10740 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
10750 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
10760 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
10770 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
10780 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10790 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74 72  eeGetReserve(Btr
107a0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
107b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
107c0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70  nter(p);.  n = p
107d0 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ->pBt->pageSize 
107e0 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  - p->pBt->usable
107f0 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42  Size;.  sqlite3B
10800 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
10810 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
10820 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d  ** Set the maxim
10830 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f  um page count fo
10840 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20  r a database if 
10850 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
10860 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65  ve..** No change
10870 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78  s are made if mx
10880 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67  Page is 0 or neg
10890 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64  ative..** Regard
108a0 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
108b0 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74  e of mxPage, ret
108c0 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  urn the maximum 
108d0 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69  page count..*/.i
108e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  nt sqlite3BtreeM
108f0 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65  axPageCount(Btre
10900 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
10910 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
10920 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10930 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
10940 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
10950 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  nt(p->pBt->pPage
10960 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
10970 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10980 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
10990 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
109a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
109b0 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
109c0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
109d0 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20  TE_OMIT_VACUUM) 
109e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  */../*.** Change
109f0 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
10a00 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74  m' property of t
10a10 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
10a20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27  the 'autoVacuum'
10a30 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73  .** parameter is
10a40 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
10a50 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
10a60 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20   is enabled. If 
10a70 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64  zero, it.** is d
10a80 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66  isabled. The def
10a90 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74  ault value for t
10aa0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70  he auto-vacuum p
10ab0 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64  roperty is .** d
10ac0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
10ad0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
10ae0 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f  AUTOVACUUM macro
10af0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
10b00 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
10b10 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  um(Btree *p, int
10b20 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69   autoVacuum){.#i
10b30 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
10b40 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
10b50 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
10b60 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74  ONLY;.#else.  Bt
10b70 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
10b80 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
10b90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 38   SQLITE_OK;.  u8
10ba0 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56 61   av = (u8)autoVa
10bb0 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  cuum;..  sqlite3
10bc0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
10bd0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
10be0 7a 65 46 69 78 65 64 20 26 26 20 28 61 76 20 3f  zeFixed && (av ?
10bf0 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56  1:0)!=pBt->autoV
10c00 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
10c10 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
10c20 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
10c30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
10c40 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70  = av ?1:0;.    p
10c50 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
10c60 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d   av==2 ?1:0;.  }
10c70 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
10c80 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
10c90 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
10ca0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
10cb0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
10cc0 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
10cd0 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
10ce0 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
10cf0 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
10d00 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
10d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
10d20 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
10d30 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
10d40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
10d50 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
10d60 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
10d70 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
10d80 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10d90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
10da0 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
10db0 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
10dc0 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
10dd0 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
10de0 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
10df0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
10e00 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
10e10 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
10e20 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
10e30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
10e40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
10e50 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
10e60 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
10e70 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
10e80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10e90 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
10ea0 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
10eb0 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
10ec0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
10ed0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
10ee0 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
10ef0 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
10f00 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
10f10 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
10f20 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
10f30 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
10f40 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
10f50 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
10f60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
10f70 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
10f80 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
10f90 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
10fa0 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
10fb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
10fc0 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
10fd0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
10fe0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
10ff0 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge1;.  int nPage
11000 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
11010 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11020 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
11030 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
11040 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
11050 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
11060 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
11070 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
11080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11090 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
110a0 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
110b0 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
110c0 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
110d0 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
110e0 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
110f0 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
11100 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11110 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
11120 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
11130 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
11140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
11150 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
11160 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ailed;.  }else i
11170 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
11180 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
11190 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
111a0 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
111b0 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
111c0 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
111d0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
111e0 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
111f0 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
11200 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
11210 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
11220 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
11230 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
11240 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72   ){.      pBt->r
11250 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
11260 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
11270 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
11280 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
11290 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
112a0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
112b0 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
112c0 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
112d0 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
112e0 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
112f0 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
11300 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
11310 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
11320 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
11330 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
11340 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
11350 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
11360 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
11370 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
11380 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
11390 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
113a0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
113b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
113c0 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
113d0 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
113e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
113f0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
11400 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
11410 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
11420 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
11430 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
11440 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
11450 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
11460 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
11470 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
11480 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
11490 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
114a0 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
114b0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
114c0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
114d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
114e0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
114f0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
11500 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
11510 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
11520 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
11530 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
11540 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
11550 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
11560 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
11570 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
11580 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
11590 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
115a0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
115b0 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
115c0 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
115d0 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
115e0 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
115f0 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
11600 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
11610 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
11620 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
11630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
11640 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
11650 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
11660 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
11670 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
11680 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
11690 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
116a0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
116b0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
116c0 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
116d0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
116e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
116f0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
11700 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
11710 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
11720 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
11730 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
11740 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
11750 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
11760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
11780 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
11790 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
117a0 29 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69  ) goto page1_ini
117b0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  t_failed;.      
117c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
117d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
117e0 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
117f0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
11800 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
11810 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
11820 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70  ageSize = (u16)p
11830 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
11840 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 28  ->usableSize = (
11850 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u16)usableSize;.
11860 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11870 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
11880 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75     pBt->autoVacu
11890 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
118a0 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29  page1[36 + 4*4])
118b0 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ?1:0);.    pBt->
118c0 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
118d0 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
118e0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
118f0 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20  endif.  }..  /* 
11900 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20  maxLocal is the 
11910 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  maximum amount o
11920 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f  f payload to sto
11930 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20  re locally for. 
11940 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b   ** a cell.  Mak
11950 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61  e sure it is sma
11960 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61  ll enough so tha
11970 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61  t at least minFa
11980 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20  nout.  ** cells 
11990 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  can will fit on 
119a0 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73  one page.  We as
119b0 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70  sume a 10-byte p
119c0 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  age header..  **
119d0 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79   Besides the pay
119e0 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d  load, the cell m
119f0 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20  ust store:.  ** 
11a00 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74      2-byte point
11a10 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20  er to the cell. 
11a20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63   **     4-byte c
11a30 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a  hild pointer.  *
11a40 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65  *     9-byte nKe
11a50 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  y value.  **    
11a60 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61   4-byte nData va
11a70 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62  lue.  **     4-b
11a80 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  yte overflow pag
11a90 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53  e pointer.  ** S
11aa0 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74  o a cell consist
11ab0 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f  s of a 2-byte po
11ac0 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  iner, a header w
11ad0 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
11ae0 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
11af0 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
11b00 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
11b10 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
11b20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
11b30 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
11b40 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
11b50 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e  axLocal = (pBt->
11b60 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36  usableSize-12)*6
11b70 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42  4/255 - 23;.  pB
11b80 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70  t->minLocal = (p
11b90 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
11ba0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a  2)*32/255 - 23;.
11bb0 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
11bc0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
11bd0 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 35;.  pBt->mi
11be0 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e 75 73  nLeaf = (pBt->us
11bf0 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
11c00 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73 73 65  255 - 23;.  asse
11c10 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
11c20 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
11c30 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
11c40 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
11c50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20 53  age1;.  return S
11c60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31  QLITE_OK;..page1
11c70 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20  _init_failed:.  
11c80 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
11c90 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
11ca0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
11cb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
11cc0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
11cd0 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65 28   like lockBtree(
11ce0 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74  ) except that it
11cf0 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74 68   also invokes th
11d00 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62 61  e.** busy callba
11d10 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20 6c  ck if there is l
11d20 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e 0a  ock contention..
11d30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
11d40 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
11d50 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a 20  (Btree *pRef){. 
11d60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11d70 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
11d80 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
11d90 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b 0a  sMutex(pRef) );.
11da0 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54 72    if( pRef->inTr
11db0 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
11dc0 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61 6e  ){.    u8 inTran
11dd0 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d 3e  saction = pRef->
11de0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11df0 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e 74  on;.    btreeInt
11e00 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20 20  egrity(pRef);.  
11e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11e20 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 52  reeBeginTrans(pR
11e30 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65 66  ef, 0);.    pRef
11e40 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
11e50 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61 63  tion = inTransac
11e60 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d 3e  tion;.    pRef->
11e70 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
11e80 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72 63  NONE;.    if( rc
11e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11ea0 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e       pRef->pBt->
11eb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
11ec0 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65 49      }.    btreeI
11ed0 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
11ee0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11ef0 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a 2a  .}.       ../*.*
11f00 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
11f10 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  o outstanding cu
11f20 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65  rsors and we are
11f30 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64   not in the midd
11f40 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73  le.** of a trans
11f50 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65  action but there
11f60 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20   is a read lock 
11f70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  on the database,
11f80 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f   then.** this ro
11f90 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65  utine unrefs the
11fa0 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
11fb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11fc0 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74   which .** has t
11fd0 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c  he effect of rel
11fe0 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20  easing the read 
11ff0 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
12000 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74  here are any out
12010 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
12020 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
12030 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
12040 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
12050 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
12060 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
12070 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12080 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12090 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
120a0 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
120b0 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
120c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
120d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
120e0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
120f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
12100 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43 75  NONE && pBt->pCu
12110 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d 3e  rsor==0 && pBt->
12120 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20  pPage1!=0 ){.   
12130 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
12140 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
12150 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
12160 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
12170 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20  pBt->pPager)==1 
12180 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
12190 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
121a0 61 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  a );.    release
121b0 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
121c0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  );.    pBt->pPag
121d0 65 31 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e1 = 0;.  }.}../
121e0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
121f0 77 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  w database by in
12200 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
12210 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
12220 0a 2a 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  .** file..*/.sta
12230 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
12240 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
12250 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
12260 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
12270 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
12280 20 72 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65   rc;.  int nPage
12290 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
122a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
122b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
122c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
122d0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
122e0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
122f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
12300 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30  TE_OK || nPage>0
12310 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
12320 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70  c;.  }.  pP1 = p
12330 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73  Bt->pPage1;.  as
12340 73 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a  sert( pP1!=0 );.
12350 20 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44    data = pP1->aD
12360 61 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ata;.  rc = sqli
12370 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
12380 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
12390 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
123a0 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  c;.  memcpy(data
123b0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
123c0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
123d0 64 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28  der));.  assert(
123e0 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65   sizeof(zMagicHe
123f0 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70  ader)==16 );.  p
12400 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 31 36  ut2byte(&data[16
12410 5d 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ], pBt->pageSize
12420 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
12430 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
12440 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
12450 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
12460 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
12470 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
12480 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
12490 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
124a0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
124b0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
124c0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
124d0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
124e0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
124f0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
12500 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
12510 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
12520 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
12530 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
12540 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
12550 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
12560 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
12570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
12580 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
12590 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
125a0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
125b0 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
125c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
125d0 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
125e0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
125f0 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
12600 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
12610 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
12620 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
12630 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
12640 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
12650 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12660 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12670 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
12680 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
12690 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
126a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
126b0 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
126c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
126d0 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
126e0 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
126f0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
12700 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
12710 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
12720 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
12730 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
12740 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
12750 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
12760 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
12770 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
12780 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
12790 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
127a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
127b0 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
127c0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
127d0 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
127e0 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
127f0 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
12800 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
12810 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
12820 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
12830 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
12840 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
12850 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
12860 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
12870 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
12880 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
12890 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
128a0 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
128b0 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
128c0 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
128d0 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
128e0 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
128f0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
12900 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
12910 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
12920 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
12930 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
12940 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
12950 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12960 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
12970 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12980 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
12990 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
129a0 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
129b0 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
129c0 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
129d0 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
129e0 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
129f0 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
12a00 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
12a10 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
12a20 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
12a30 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
12a40 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
12a50 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
12a60 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
12a70 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
12a80 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
12a90 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
12aa0 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
12ab0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
12ac0 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
12ad0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
12ae0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
12af0 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
12b00 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12b10 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
12b20 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
12b30 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
12b40 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
12b50 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
12b60 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
12b70 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
12b80 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
12b90 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
12ba0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
12bb0 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
12bc0 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
12bd0 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
12be0 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
12bf0 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
12c00 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
12c10 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
12c20 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
12c30 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
12c40 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
12c50 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
12c60 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
12c70 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
12c80 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
12c90 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
12ca0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
12cb0 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
12cc0 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
12cd0 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
12ce0 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
12cf0 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
12d00 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
12d10 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
12d20 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
12d30 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
12d40 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
12d50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12d60 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
12d70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
12d80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
12d90 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
12da0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
12db0 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
12dc0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
12dd0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
12de0 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
12df0 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
12e00 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
12e10 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
12e20 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
12e30 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
12e40 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
12e50 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
12e60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
12e70 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
12e80 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
12e90 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
12ea0 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
12eb0 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
12ec0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
12ed0 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
12ee0 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
12ef0 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
12f00 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
12f10 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
12f20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
12f30 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
12f40 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
12f50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12f60 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
12f70 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74  * If another dat
12f80 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73  abase handle has
12f90 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20   already opened 
12fa0 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
12fb0 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69  ion .  ** on thi
12fc0 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73  s shared-btree s
12fd0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73  tructure and a s
12fe0 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e  econd write tran
12ff0 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
13000 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72  requested, retur
13010 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  n SQLITE_LOCKED.
13020 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66  .  */.  if( (wrf
13030 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
13040 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
13050 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e  _WRITE) || pBt->
13060 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20  isPending ){.   
13070 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
13080 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65  Writer->db;.  }e
13090 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31  lse if( wrflag>1
130a0 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
130b0 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70  pIter;.    for(p
130c0 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
130d0 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
130e0 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
130f0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
13100 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
13110 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
13120 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
13130 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
13140 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13150 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a    if( pBlock ){.
13160 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
13170 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e  ctionBlocked(p->
13180 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20  db, pBlock);.   
13190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
131a0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
131b0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
131c0 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69  begun;.  }.#endi
131d0 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
131e0 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
131f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
13200 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
13210 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
13220 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
13230 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
13240 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
13250 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
13260 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
13270 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
13280 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
13290 65 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53  ened. */.  if( S
132a0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
132b0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
132c0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
132d0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
132e0 4f 43 4b 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  OCK)) ){.    got
132f0 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
13300 20 7d 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f   }..  do {.    /
13310 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
13320 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
13330 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
13340 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
13350 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
13360 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
13370 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
13380 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
13390 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
133a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
133b0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
133c0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
133d0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
133e0 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
133f0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
13400 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
13410 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
13420 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
13430 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
13440 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
13450 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
13460 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
13470 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
13480 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
13490 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
134a0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
134b0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
134c0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
134d0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
134e0 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
134f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13500 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13510 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f    if( pBt->readO
13520 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 72  nly ){.        r
13530 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
13540 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NLY;.      }else
13550 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
13560 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69 6e  qlite3PagerBegin
13570 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66  (pBt->pPager,wrf
13580 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d  lag>1,sqlite3Tem
13590 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29  pInMemory(p->db)
135a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
135b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
135c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e            rc = n
135d0 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b  ewDatabase(pBt);
135e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
135f0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
13600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13610 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  K ){.      unloc
13620 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
13630 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
13640 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
13650 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
13660 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
13670 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
13680 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
13690 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
136a0 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
136b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
136c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
136d0 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
136e0 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
136f0 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
13700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13710 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
13720 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
13730 7b 0a 09 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  {..assert( p->lo
13740 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
13750 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
13760 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
13770 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
13780 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
13790 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
137a0 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
137b0 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
137c0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
137d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
137e0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
137f0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
13800 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
13810 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
13820 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
13830 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
13840 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13850 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
13860 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
13870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
13880 45 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28  ED_CACHE.    if(
13890 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
138a0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
138b0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
138c0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
138d0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45  ;.      pBt->isE
138e0 78 63 6c 75 73 69 76 65 20 3d 20 28 75 38 29 28  xclusive = (u8)(
138f0 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d  wrflag>1);.    }
13900 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72  .#endif.  }...tr
13910 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28  ans_begun:.  if(
13920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
13930 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
13940 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
13950 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
13960 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
13970 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
13980 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76  .    ** open sav
13990 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20  epoints. If the 
139a0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
139b0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
139c0 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68   0 and.    ** th
139d0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73  e sub-journal is
139e0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
139f0 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 20  n, then it will 
13a00 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a  be opened here..
13a10 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
13a20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
13a30 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70  Savepoint(pBt->p
13a40 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53  Pager, p->db->nS
13a50 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a  avepoint);.  }..
13a60 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
13a70 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  (p);.  sqlite3Bt
13a80 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
13a90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
13aa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13ab0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a  _AUTOVACUUM../*.
13ac0 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74  ** Set the point
13ad0 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66  er-map entries f
13ae0 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  or all children 
13af0 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e 20 41  of page pPage. A
13b00 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65  lso, if.** pPage
13b10 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20   contains cells 
13b20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
13b30 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65  erflow pages, se
13b40 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a  t the pointer.**
13b50 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
13b60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
13b70 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a  ges as well..*/.
13b80 73 74 61 74 69 63 20 69 6e 74 20 73 65 74 43 68  static int setCh
13b90 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61  ildPtrmaps(MemPa
13ba0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e  ge *pPage){.  in
13bb0 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69   /* Counter vari
13be0 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  able */.  int nC
13bf0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
13c00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c10 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
13c20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f  in page pPage */
13c30 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c50 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
13c60 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  code */.  BtShar
13c70 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
13c80 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49 6e 69  >pBt;.  u8 isIni
13c90 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69  tOrig = pPage->i
13ca0 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67  sInit;.  Pgno pg
13cb0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
13cc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
13cd0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13ce0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
13cf0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
13d00 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
13d10 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(pPage);.  if( 
13d20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13d30 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68  .    goto set_ch
13d40 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
13d50 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70  .  }.  nCell = p
13d60 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
13d70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
13d80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
13d90 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
13da0 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20  (pPage, i);..   
13db0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f   rc = ptrmapPutO
13dc0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
13dd0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
13de0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13df0 20 20 20 20 20 67 6f 74 6f 20 73 65 74 5f 63 68       goto set_ch
13e00 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
13e10 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
13e20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
13e30 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
13e40 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
13e50 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63  pCell);.      rc
13e60 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
13e70 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
13e80 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29  MAP_BTREE, pgno)
13e90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13ea0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
13eb0 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
13ec0 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ps_out;.    }.  
13ed0 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  }..  if( !pPage-
13ee0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e  >leaf ){.    Pgn
13ef0 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
13f00 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
13f10 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
13f20 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72  ffset+8]);.    r
13f30 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
13f40 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
13f50 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
13f60 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c  );.  }..set_chil
13f70 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20  d_ptrmaps_out:. 
13f80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
13f90 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72   isInitOrig;.  r
13fa0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13fb0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
13fc0 70 50 61 67 65 2c 20 77 68 69 63 68 20 69 73 20  pPage, which is 
13fd0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
13fe0 20 61 20 62 74 72 65 65 20 70 61 67 65 2c 20 6e   a btree page, n
13ff0 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  ot an overflow.*
14000 2a 20 70 61 67 65 2c 20 69 73 20 61 20 70 6f 69  * page, is a poi
14010 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69 46 72  nter to page iFr
14020 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68 69 73 20  om. Modify this 
14030 70 6f 69 6e 74 65 72 20 73 6f 20 74 68 61 74 20  pointer so that 
14040 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
14050 69 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65  iTo. Parameter e
14060 54 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74  Type describes t
14070 68 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74  he type of point
14080 65 72 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65  er to be modifie
14090 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77  d, as .** follow
140a0 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  s:.**.** PTRMAP_
140b0 42 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65  BTREE:     pPage
140c0 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65   is a btree-page
140d0 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
140e0 69 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20  ints at a child 
140f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
14100 20 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50        page of pP
14110 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
14120 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61  P_OVERFLOW1: pPa
14130 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61  ge is a btree-pa
14140 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
14150 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65  points at an ove
14160 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  rflow.**        
14170 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
14180 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e  pointed to by on
14190 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f  e of the cells o
141a0 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  n pPage..**.** P
141b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
141c0 20 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65   pPage is an ove
141d0 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20  rflow-page. The 
141e0 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
141f0 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20  t the next.**   
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
14220 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
14230 61 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50  atic int modifyP
14240 61 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61  agePointer(MemPa
14250 67 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20  ge *pPage, Pgno 
14260 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c  iFrom, Pgno iTo,
14270 20 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73   u8 eType){.  as
14280 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
14290 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
142a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
142b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
142c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
142d0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
142e0 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
142f0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
14300 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
14310 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
14320 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
14330 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
14340 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
14350 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
14360 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
14370 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
14380 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14390 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
143a0 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
143b0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
143c0 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
143d0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
143e0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
143f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
14400 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73  nt nCell;..    s
14410 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
14420 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
14430 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
14440 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69  Cell;..    for(i
14450 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
14460 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  ){.      u8 *pCe
14470 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
14480 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69  age, i);.      i
14490 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
144a0 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20  _OVERFLOW1 ){.  
144b0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
144c0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nfo;.        sql
144d0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
144e0 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
144f0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
14500 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76      if( info.iOv
14510 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
14520 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67      if( iFrom==g
14530 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
14540 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20  nfo.iOverflow]) 
14550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14560 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  ut4byte(&pCell[i
14570 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20  nfo.iOverflow], 
14580 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
14590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
145a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
145b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
145c0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
145d0 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
145e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
145f0 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
14600 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
14610 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
14620 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14630 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
14640 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
14650 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
14660 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
14670 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
14680 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
14690 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
146a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
146b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
146c0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
146d0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
146e0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
146f0 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
14700 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  , iTo);.    }.. 
14710 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
14720 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20   = isInitOrig;. 
14730 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14740 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
14750 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
14760 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
14770 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
14780 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
14790 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
147a0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
147b0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
147c0 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lid..*/.static i
147d0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
147e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
147f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
14800 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
14810 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
14820 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
14830 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
14840 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
14850 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14860 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
14870 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
14880 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
14890 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
148a0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
148b0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
148c0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
148d0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
148e0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
148f0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
14900 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
14910 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d   isCommit.){.  M
14920 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65  emPage *pPtrPage
14930 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ;   /* The page 
14940 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
14950 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61  pointer to pDbPa
14960 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62  ge */.  Pgno iDb
14970 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e  Page = pDbPage->
14980 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70  pgno;.  Pager *p
14990 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61  Pager = pBt->pPa
149a0 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ger;.  int rc;..
149b0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
149c0 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
149d0 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  2 || eType==PTRM
149e0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20  AP_OVERFLOW1 || 
149f0 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54  .      eType==PT
14a00 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
14a10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
14a20 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74  PAGE );.  assert
14a30 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14a40 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14a50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44   );.  assert( pD
14a60 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20  bPage->pBt==pBt 
14a70 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61  );..  /* Move pa
14a80 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20  ge iDbPage from 
14a90 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  its current loca
14aa0 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d  tion to page num
14ab0 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f  ber iFreePage */
14ac0 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56  .  TRACE(("AUTOV
14ad0 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64  ACUUM: Moving %d
14ae0 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64   to free page %d
14af0 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79   (ptr page %d ty
14b00 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  pe %d)\n", .    
14b10 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65    iDbPage, iFree
14b20 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Page, iPtrPage, 
14b30 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20  eType));.  rc = 
14b40 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
14b50 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62  page(pPager, pDb
14b60 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69  Page->pDbPage, i
14b70 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d  FreePage, isComm
14b80 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  it);.  if( rc!=S
14b90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14ba0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
14bb0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d   pDbPage->pgno =
14bc0 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f   iFreePage;..  /
14bd0 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73  * If pDbPage was
14be0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74   a btree-page, t
14bf0 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20  hen it may have 
14c00 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f  child pages and/
14c10 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68  or cells.  ** th
14c20 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
14c30 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20  flow pages. The 
14c40 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
14c50 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ies for all thes
14c60 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65  e.  ** pages nee
14c70 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e  d to be changed.
14c80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44  .  **.  ** If pD
14c90 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  bPage is an over
14ca0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
14cb0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
14cc0 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20  s may store a.  
14cd0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20  ** pointer to a 
14ce0 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66  subsequent overf
14cf0 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69  low page. If thi
14d00 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
14d10 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69  hen.  ** the poi
14d20 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74  nter map needs t
14d30 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72  o be updated for
14d40 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   the subsequent 
14d50 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20  overflow page.. 
14d60 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d   */.  if( eType=
14d70 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
14d80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
14d90 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
14da0 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d  c = setChildPtrm
14db0 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20  aps(pDbPage);.  
14dc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14dd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
14de0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
14df0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
14e00 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62  nextOvfl = get4b
14e10 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61  yte(pDbPage->aDa
14e20 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  ta);.    if( nex
14e30 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20  tOvfl!=0 ){.    
14e40 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
14e50 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
14e60 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
14e70 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
14e80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14e90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14ea0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14eb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
14ec0 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61   /* Fix the data
14ed0 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20  base pointer on 
14ee0 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68  page iPtrPage th
14ef0 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44  at pointed at iD
14f00 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68  bPage so.  ** th
14f10 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20  at it points at 
14f20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20  iFreePage. Also 
14f30 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20  fix the pointer 
14f40 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20  map entry for.  
14f50 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a  ** iPtrPage..  *
14f60 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50  /.  if( eType!=P
14f70 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
14f80 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14f90 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
14fa0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
14fb0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
14fc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14fd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
14fe0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
14ff0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
15000 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
15010 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
15020 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15030 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
15040 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
15050 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
15060 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
15070 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
15080 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
15090 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
150a0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
150b0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
150c0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
150d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
150e0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
150f0 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61 67  ut(pBt, iFreePag
15100 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  e, eType, iPtrPa
15110 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ge);.    }.  }. 
15120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15130 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
15140 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
15150 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
15160 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
15170 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
15180 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
15190 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
151a0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
151b0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
151c0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
151d0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
151e0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
151f0 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53  ful,.** return S
15200 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
15210 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
15220 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
15230 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69  re no.** point i
15240 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66  n calling this f
15250 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20  unction again), 
15260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
15270 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73  NE..**.** More s
15280 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20  pecificly, this 
15290 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
152a0 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65  s to re-organize
152b0 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
152c0 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61  e so that the la
152d0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  st page of the f
152e0 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ile currently in
152f0 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f   use.** is no lo
15300 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
15310 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70  ** If the nFin p
15320 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
15330 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d  zero, the implem
15340 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73  entation assumes
15350 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c  .** that the cal
15360 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61  ler will keep ca
15370 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d  lling incrVacuum
15380 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20  Step() until.** 
15390 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
153a0 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72  E_DONE or an err
153b0 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69  or, and that nFi
153c0 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  n is the.** numb
153d0 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65 20  er of pages the 
153e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
153f0 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72  ll contain after
15400 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73   this .** proces
15410 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a  s is complete..*
15420 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63  /.static int inc
15430 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68  rVacuumStep(BtSh
15440 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
15450 6e 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74  nFin, Pgno iLast
15460 50 67 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65  Pg){.  Pgno nFre
15470 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
15480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
15490 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
154a0 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
154b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
154c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
154d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
154e0 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
154f0 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
15500 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
15510 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
15520 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
15530 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
15540 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
15550 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
15560 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
15570 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
15580 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
15590 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
155a0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
155b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
155c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
155d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
155e0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
155f0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
15600 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
15610 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15620 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
15630 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
15640 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
15650 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
15660 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15670 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15680 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
15690 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
156a0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
156b0 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
156c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
156d0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
156e0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
156f0 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
15700 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
15710 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
15720 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
15730 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
15740 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
15750 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
15760 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
15770 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
15780 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
15790 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
157a0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
157b0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
157c0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
157d0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
157e0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
157f0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
15800 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
15810 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
15820 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
15830 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
15840 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
15850 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
15860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15870 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
15880 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
15890 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
158a0 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
158b0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
158c0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
158d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
158e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
158f0 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
15900 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
15910 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
15920 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
15930 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
15940 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
15950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
15960 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
15970 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
15980 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
15990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
159a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
159b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
159c0 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
159d0 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
159e0 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
159f0 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
15a00 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
15a10 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
15a20 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
15a30 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
15a40 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
15a50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
15a60 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
15a70 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
15a80 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
15a90 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
15aa0 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
15ab0 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
15ac0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
15ad0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
15ae0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
15af0 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
15b00 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
15b10 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
15b20 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
15b30 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
15b40 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
15b50 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
15b60 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
15b70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15b90 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
15ba0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
15bb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15bc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15bd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
15be0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
15bf0 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
15c00 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
15c10 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
15c20 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
15c30 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
15c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
15c50 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
15c60 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
15c70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15c80 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
15c90 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
15ca0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
15cb0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
15cc0 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
15cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
15ce0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
15cf0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15d00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15d10 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15d20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15d30 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
15d40 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
15d50 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
15d60 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
15d70 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
15d80 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
15d90 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
15da0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
15db0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
15dc0 50 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 4d  Pg) ){.        M
15dd0 65 6d 50 61 67 65 20 2a 70 50 67 3b 0a 20 20 20  emPage *pPg;.   
15de0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71       int rc = sq
15df0 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
15e00 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
15e10 26 70 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  &pPg, 0);.      
15e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
15e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15e50 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
15e60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
15e70 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
15e80 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
15e90 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
15ea0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
15eb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15ec0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15ed0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15ee0 7d 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  }.      iLastPg-
15ef0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  -;.    }.    sql
15f00 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
15f10 65 49 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67  eImage(pBt->pPag
15f20 65 72 2c 20 69 4c 61 73 74 50 67 29 3b 0a 20 20  er, iLastPg);.  
15f30 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15f40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
15f50 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
15f60 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
15f70 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
15f80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
15f90 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
15fa0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
15fb0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
15fc0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
15fd0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
15fe0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
15ff0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
16000 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
16010 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
16020 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
16030 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
16040 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
16050 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
16060 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
16070 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
16080 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
16090 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
160a0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
160b0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
160c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
160d0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
160e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
160f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16100 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
16110 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
16120 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
16130 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
16140 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
16150 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
16160 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
16170 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
16180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
16190 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
161a0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
161b0 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
161c0 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
161d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
161e0 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
161f0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16210 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
16220 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
16230 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
16240 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
16250 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
16260 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
16270 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
16280 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
16290 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
162a0 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
162b0 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
162c0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
162d0 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
162e0 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
162f0 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
16300 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
16310 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
16320 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
16330 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
16340 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
16350 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
16360 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
16370 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
16380 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
16390 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
163a0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
163b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
163c0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
163d0 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
163e0 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
163f0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
16400 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
16410 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
16420 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
16430 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
16440 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
16450 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
16460 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
16470 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
16480 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
16490 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
164a0 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67  gno nFin;.    Pg
164b0 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67  no nFree;.    Pg
164c0 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
164d0 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20  Pgno iFree;.    
164e0 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
164f0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
16500 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
16510 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
16520 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50  pBt);..    if( P
16530 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
16540 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
16550 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
16560 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
16570 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
16580 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
16590 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
165a0 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
165b0 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
165c0 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
165d0 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
165e0 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
165f0 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
16600 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
16610 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
16620 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
16630 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
16640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16650 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
16660 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
16670 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
16680 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
16690 29 3b 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d  );.    nPtrmap =
166a0 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54   (nFree-nOrig+PT
166b0 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
166c0 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f   nOrig)+pgsz/5)/
166d0 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46  (pgsz/5);.    nF
166e0 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
166f0 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
16700 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44    if( nOrig>PEND
16710 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16720 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49  t) && nFin<PENDI
16730 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
16740 29 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d  ) ){.      nFin-
16750 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  -;.    }.    whi
16760 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
16770 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
16780 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
16790 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
167a0 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
167b0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 69 6e    }.    if( nFin
167c0 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72 6e 20  >nOrig ) return 
167d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
167e0 4b 50 54 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46  KPT;..    for(iF
167f0 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65  ree=nOrig; iFree
16800 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c  >nFin && rc==SQL
16810 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29  ITE_OK; iFree--)
16820 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63  {.      rc = inc
16830 72 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c  rVacuumStep(pBt,
16840 20 6e 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20   nFin, iFree);. 
16850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
16860 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
16870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
16880 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
16890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
168a0 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  OK;.      rc = s
168b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
168c0 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
168d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
168e0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
168f0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
16900 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
16910 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
16920 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
16930 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16940 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
16950 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69  pBt->pPager, nFi
16960 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
16970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16980 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16990 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
169a0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
169b0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
169c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ==sqlite3PagerRe
169d0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
169e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
169f0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
16a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16a10 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
16a20 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
16a30 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
16a40 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
16a50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
16a60 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
16a70 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
16a80 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
16a90 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
16aa0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
16ab0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
16ac0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
16ad0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
16ae0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
16af0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
16b00 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
16b10 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
16b20 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
16b30 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
16b40 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
16b50 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
16b60 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
16b70 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
16b80 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
16b90 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
16ba0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
16bb0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
16bc0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
16bd0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
16be0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
16bf0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
16c00 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
16c10 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
16c20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
16c30 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
16c40 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
16c50 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
16c60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16c70 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
16c80 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
16c90 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
16ca0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
16cb0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
16cc0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
16cd0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
16ce0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
16cf0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
16d00 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
16d10 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
16d20 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
16d30 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
16d40 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
16d50 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
16d60 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
16d70 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
16d80 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
16d90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16da0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
16db0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
16dc0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
16dd0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
16de0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
16df0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
16e00 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
16e10 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
16e20 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
16e30 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
16e40 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
16e50 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
16e60 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
16e70 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
16e80 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
16e90 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
16ea0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
16eb0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
16ec0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
16ed0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
16ee0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
16ef0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
16f00 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
16f10 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
16f20 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
16f30 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
16f40 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
16f50 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
16f60 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
16f70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
16f80 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
16f90 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
16fa0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
16fb0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
16fc0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
16fd0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
16fe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16ff0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
17000 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
17010 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
17020 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
17030 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17040 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
17050 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
17060 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
17070 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17080 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
17090 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
170a0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
170b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
170c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
170d0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
170e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
170f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
17100 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71  ndif.    rc = sq
17110 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
17120 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50  PhaseOne(pBt->pP
17130 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30  ager, zMaster, 0
17140 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
17150 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
17160 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17170 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
17180 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66  tion is called f
17190 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f  rom both BtreeCo
171a0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61  mmitPhaseTwo() a
171b0 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  nd BtreeRollback
171c0 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e  ().** at the con
171d0 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61  clusion of a tra
171e0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nsaction..*/.sta
171f0 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e  tic void btreeEn
17200 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72  dTransaction(Btr
17210 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
17220 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17230 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
17240 73 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  sr;.  assert( sq
17250 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
17260 75 74 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a  utex(p) );..  /*
17270 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 63 75   Search for a cu
17280 72 73 6f 72 20 68 65 6c 64 20 6f 70 65 6e 20 62  rsor held open b
17290 79 20 74 68 69 73 20 62 2d 74 72 65 65 20 63 6f  y this b-tree co
172a0 6e 6e 65 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65  nnection. If one
172b0 20 65 78 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68   exists,.  ** th
172c0 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
172d0 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67  on will be downg
172e0 72 61 64 65 64 20 74 6f 20 61 20 72 65 61 64 2d  raded to a read-
172f0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
17300 0a 20 20 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  .  ** instead of
17310 20 61 63 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75   actually conclu
17320 64 65 64 2e 20 41 20 73 75 62 73 65 71 75 65 6e  ded. A subsequen
17330 74 20 63 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74  t call to Commit
17340 50 68 61 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a  PhaseTwo() .  **
17350 20 6f 72 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77   or Rollback() w
17360 69 6c 6c 20 66 69 6e 69 73 68 20 74 68 65 20 74  ill finish the t
17370 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 75  ransaction and u
17380 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
17390 73 65 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43  se.  */.  for(pC
173a0 73 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  sr=pBt->pCursor;
173b0 20 70 43 73 72 20 26 26 20 70 43 73 72 2d 3e 70   pCsr && pCsr->p
173c0 42 74 72 65 65 21 3d 70 3b 20 70 43 73 72 3d 70  Btree!=p; pCsr=p
173d0 43 73 72 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61  Csr->pNext);.  a
173e0 73 73 65 72 74 28 20 70 43 73 72 3d 3d 30 20 7c  ssert( pCsr==0 |
173f0 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  | p->inTrans>TRA
17400 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74  NS_NONE );..  bt
17410 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
17420 6e 74 28 70 42 74 29 3b 0a 20 20 69 66 28 20 70  nt(pBt);.  if( p
17430 43 73 72 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67  Csr ){.    downg
17440 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
17450 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b  heTableLocks(p);
17460 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
17470 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
17480 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
17490 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20   the handle had 
174a0 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e  any kind of tran
174b0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65  saction open, de
174c0 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20  crement the .   
174d0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
174e0 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61  count of the sha
174f0 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74 68  red btree. If th
17500 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
17510 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63  unt .    ** reac
17520 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20 73  hes 0, set the s
17530 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
17540 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
17550 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
17560 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  ed().    ** call
17570 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f   below will unlo
17580 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a  ck the pager.  *
17590 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  /.    if( p->inT
175a0 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans!=TRANS_NONE
175b0 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41   ){.      clearA
175c0 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62  llSharedCacheTab
175d0 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20  leLocks(p);.    
175e0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
175f0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28  ion--;.      if(
17600 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
17610 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ction ){.       
17620 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
17630 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
17640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17650 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
17660 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
17670 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
17680 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
17690 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70  ck the .    ** p
176a0 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61 6c  ager if this cal
176b0 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c  l closed the onl
176c0 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  y read or write 
176d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f  transaction.  */
176e0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
176f0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
17700 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
17710 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a  nused(pBt);.  }.
17720 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
17730 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  y(p);.}../*.** C
17740 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
17750 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
17760 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a  in progress..**.
17770 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17780 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73  implements the s
17790 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61  econd phase of a
177a0 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e   2-phase commit.
177b0 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33    The.** sqlite3
177c0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
177d0 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  One() routine do
177e0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
177f0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a  se and should.**
17800 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f   be invoked prio
17810 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
17820 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
17830 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
17840 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20  itPhaseOne().** 
17850 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20  routine did all 
17860 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74  the work of writ
17870 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
17880 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  out to disk and 
17890 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20  flushing the.** 
178a0 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74  contents so that
178b0 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74 65   they are writte
178c0 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20  n onto the disk 
178d0 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68  platter.  All th
178e0 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61  is.** routine ha
178f0 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74  s to do is delet
17900 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72  e or truncate or
17910 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65 72   zero the header
17920 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72   in the.** the r
17930 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
17940 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
17950 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
17960 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20   commit) and.** 
17970 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  drop locks..**.*
17980 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
17990 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
179a0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
179b0 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
179c0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
179d0 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
179e0 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
179f0 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
17a00 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17a10 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
17a20 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
17a30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
17a40 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
17a50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
17a60 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
17a70 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
17a80 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
17a90 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
17aa0 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
17ab0 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
17ac0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
17ad0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
17ae0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
17af0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
17b00 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
17b10 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
17b20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
17b30 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
17b40 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
17b50 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
17b60 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
17b70 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
17b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
17b90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
17ba0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
17bb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
17bd0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17be0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
17bf0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
17c00 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
17c10 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
17c20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
17c30 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
17c40 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17c50 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
17c60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
17c70 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
17c80 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
17c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17ca0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
17cb0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
17cc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17cd0 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
17ce0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
17cf0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
17d00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17d10 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
17d20 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
17d30 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
17d40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17d50 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17d60 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
17d70 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
17d80 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
17d90 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
17da0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
17db0 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
17dc0 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
17dd0 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
17de0 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
17df0 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
17e00 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
17e10 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
17e20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
17e30 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
17e40 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
17e50 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
17e60 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
17e70 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
17e80 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
17e90 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
17ea0 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
17eb0 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
17ec0 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
17ed0 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
17ee0 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
17ef0 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
17f00 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
17f10 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
17f20 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
17f30 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
17f40 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
17f50 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
17f60 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
17f70 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
17f80 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
17f90 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
17fa0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
17fb0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
17fc0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
17fd0 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
17fe0 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
17ff0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18000 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
18010 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
18020 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
18030 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
18040 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
18050 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
18060 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
18070 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
18080 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
18090 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
180a0 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
180b0 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
180c0 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
180d0 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
180e0 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
180f0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
18100 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
18110 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
18120 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
18130 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
18140 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
18150 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
18160 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
18170 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
18180 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
18190 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
181a0 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
181b0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
181c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
181d0 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
181e0 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
181f0 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
18200 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
18210 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
18220 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
18230 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
18240 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
18250 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
18260 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
18270 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
18280 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
18290 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
182a0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
182b0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
182c0 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
182d0 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
182e0 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
182f0 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  xt){.    int i;.
18300 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
18310 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a  ClearCursor(p);.
18320 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
18330 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
18340 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
18350 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ode;.    for(i=0
18360 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69  ; i<=p->iPage; i
18370 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
18380 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67 65  sePage(p->apPage
18390 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61  [i]);.      p->a
183a0 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
183b0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
183c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
183d0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
183e0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
183f0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
18400 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
18410 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
18420 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
18430 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
18440 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
18450 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
18460 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
18470 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
18480 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
18490 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
184a0 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
184b0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
184c0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
184d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
184e0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
184f0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
18500 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
18510 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
18520 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
18530 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
18540 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
18550 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
18560 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18570 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
18580 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
18590 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
185a0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
185b0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
185c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
185d0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
185e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
185f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
18600 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
18610 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
18620 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
18630 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
18640 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
18650 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
18660 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
18670 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
18680 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
18690 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
186a0 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
186b0 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
186c0 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
186d0 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
186e0 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
186f0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
18700 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
18710 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
18720 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
18730 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
18740 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
18750 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
18760 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
18770 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
18780 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
18790 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
187a0 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
187b0 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
187c0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
187d0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
187e0 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
187f0 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
18800 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20  rity(p);..  if( 
18810 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
18820 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69  S_WRITE ){.    i
18830 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73  nt rc2;..    ass
18840 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45  ert( TRANS_WRITE
18850 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ==pBt->inTransac
18860 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20  tion );.    rc2 
18870 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  = sqlite3PagerRo
18880 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67  llback(pBt->pPag
18890 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  er);.    if( rc2
188a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
188b0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20       rc = rc2;. 
188c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
188d0 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
188e0 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65  ve destroyed the
188f0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76   pPage1->aData v
18900 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a  alue.  So.    **
18910 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74 72   call sqlite3Btr
18920 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
18930 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
18940 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
18950 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
18960 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
18970 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
18980 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
18990 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
189a0 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  0)==SQLITE_OK ){
189b0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
189c0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
189d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
189e0 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28  untWriteCursors(
189f0 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  pBt)==0 );.    p
18a00 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
18a10 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
18a20 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
18a30 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
18a40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
18a50 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
18a60 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
18a70 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
18a80 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
18a90 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
18aa0 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c  n can can be rol
18ab0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
18ac0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
18ad0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
18ae0 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
18af0 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
18b00 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
18b10 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
18b20 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
18b30 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
18b40 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
18b50 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
18b60 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
18b70 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
18b80 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
18b90 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
18ba0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
18bb0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
18bc0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
18bd0 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
18be0 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
18bf0 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
18c00 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
18c10 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
18c20 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
18c30 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
18c40 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
18c50 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
18c60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
18c70 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
18c80 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
18c90 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
18ca0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
18cb0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
18cc0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
18cd0 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
18ce0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
18cf0 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
18d00 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
18d10 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
18d20 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
18d30 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
18d40 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
18d50 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
18d60 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
18d70 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
18d80 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
18d90 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
18da0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
18db0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
18dc0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
18dd0 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
18de0 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
18df0 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
18e00 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
18e10 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
18e20 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
18e30 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
18e40 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
18e50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
18e60 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
18e70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
18e80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
18e90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
18ea0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
18eb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18ec0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
18ed0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
18ee0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
18ef0 74 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29  t->readOnly==0 )
18f00 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
18f10 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
18f20 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
18f30 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
18f40 6e 74 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  nt );.  if( NEVE
18f50 52 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  R(p->inTrans!=TR
18f60 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 42 74  ANS_WRITE || pBt
18f70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
18f80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
18f90 4e 54 45 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65  NTERNAL;.  }else
18fa0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
18fb0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
18fc0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18fd0 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 65 20 70  .    /* At the p
18fe0 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
18ff0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
19000 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
19010 6e 74 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 61  nt with.    ** a
19020 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
19030 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
19040 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
19050 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 20  icitly using.   
19060 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   ** SQL statemen
19070 74 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61  ts. It is illega
19080 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61  l to open, relea
19090 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
190a0 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20 73  ny.    ** such s
190b0 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65 20  avepoints while 
190c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
190d0 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70 6f  ansaction savepo
190e0 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a 20  int is active.. 
190f0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
19100 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
19110 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
19120 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
19130 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
19140 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19160 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
19170 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
19180 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
19190 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
191a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
191b0 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
191c0 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
191d0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
191e0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
191f0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
19200 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
19210 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
19220 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
19230 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
19240 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
19250 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
19260 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
19270 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
19280 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
19290 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
192a0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
192b0 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
192c0 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
192d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
192e0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
192f0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
19300 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
19310 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
19320 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
19330 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
19340 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
19350 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
19360 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
19370 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
19380 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
19390 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
193a0 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
193b0 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
193c0 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
193d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
193e0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
193f0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
19400 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
19410 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19420 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
19430 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
19440 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
19450 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
19460 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
19470 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
19480 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
19490 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
194a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
194b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
194c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63  Enter(p);.    rc
194d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
194e0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
194f0 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70  ager, op, iSavep
19500 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72  oint);.    if( r
19510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
19520 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
19530 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
19540 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
19550 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
19560 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19570 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
19580 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74  new cursor for t
19590 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72  he BTree whose r
195a0 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61  oot is on the pa
195b0 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54  ge.** iTable.  T
195c0 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72  he act of acquir
195d0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74  ing a cursor get
195e0 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  s a read lock on
195f0 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73   .** the databas
19600 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
19610 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e   wrFlag==0, then
19620 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
19630 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72  only be used for
19640 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20   reading..** If 
19650 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20  wrFlag==1, then 
19660 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62  the cursor can b
19670 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
19680 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69  ng or for.** wri
19690 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f  ting if other co
196a0 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69  nditions for wri
196b0 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65  ting are also me
196c0 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65  t.  These.** are
196d0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20   the conditions 
196e0 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74  that must be met
196f0 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72   in order for wr
19700 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61  iting to.** be a
19710 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a  llowed:.**.** 1:
19720 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73    The cursor mus
19730 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
19740 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d  ed with wrFlag==
19750 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65  1.**.** 2:  Othe
19760 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
19770 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72  ctions that shar
19780 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  e the same pager
19790 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75   cache.**     bu
197a0 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  t which are not 
197b0 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f  in the READ_UNCO
197c0 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61  MMITTED state ma
197d0 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20  y not have.**   
197e0 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77    cursors open w
197f0 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e  ith wrFlag==0 on
19800 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
19810 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20    Otherwise.**  
19820 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d     the changes m
19830 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74  ade by this writ
19840 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62  e cursor would b
19850 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20  e visible to.** 
19860 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72      the read cur
19870 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65  sors in the othe
19880 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
19890 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20  ction..**.** 3: 
198a0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   The database mu
198b0 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28  st be writable (
198c0 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  not on read-only
198d0 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a   media).**.** 4:
198e0 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20    There must be 
198f0 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61  an active transa
19900 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20  ction..**.** No 
19910 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
19920 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
19930 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72  at page iTable r
19940 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20  eally is the.** 
19950 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62  root page of a b
19960 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73  -tree.  If it is
19970 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63   not, then the c
19980 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a  ursor acquired.*
19990 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  * will not work 
199a0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a  correctly..**.**
199b0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
199c0 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42  hat the sqlite3B
199d0 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29  treeCursorSize()
199e0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
199f0 20 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20   .** pointed to 
19a00 62 79 20 70 43 75 72 20 68 61 76 65 20 62 65 65  by pCur have bee
19a10 6e 20 7a 65 72 6f 65 64 20 62 79 20 74 68 65 20  n zeroed by the 
19a20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  caller..*/.stati
19a30 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
19a40 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
19a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19a70 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
19a80 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
19a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19aa0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
19ab0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
19ac0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
19ad0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19af0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
19b00 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
19b10 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
19b20 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
19b30 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
19b40 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
19b50 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
19b60 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
19b90 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
19ba0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
19bb0 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74  Pgno nPage;.  Bt
19bc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
19bd0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
19be0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
19bf0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
19c00 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
19c10 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
19c20 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
19c30 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
19c40 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
19c50 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
19c60 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
19c70 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
19c80 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
19c90 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
19ca0 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
19cb0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
19cc0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
19cd0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
19ce0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
19cf0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
19d00 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
19d10 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
19d20 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
19d30 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
19d40 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
19d50 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
19d60 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
19d70 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
19d80 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
19d90 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28  );..  if( NEVER(
19da0 77 72 46 6c 61 67 20 26 26 20 70 42 74 2d 3e 72  wrFlag && pBt->r
19db0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
19dc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
19dd0 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 69  ADONLY;.  }..  i
19de0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
19df0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f  0 ){.    rc = lo
19e00 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72 79  ckBtreeWithRetry
19e10 28 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  (p);.    if( rc!
19e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19e30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19e40 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
19e50 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
19e60 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d  o)iTable;.  rc =
19e70 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
19e80 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
19e90 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67  er, (int *)&nPag
19ea0 65 29 3b 20 0a 20 20 69 66 28 20 72 63 21 3d 53  e); .  if( rc!=S
19eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ec0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
19ed0 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
19ee0 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  & nPage==0 ){.  
19ef0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d    rc = SQLITE_EM
19f00 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72  PTY;.    goto cr
19f10 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
19f20 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20  ption;.  }.  rc 
19f30 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
19f40 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
19f50 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50  Root, &pCur->apP
19f60 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72  age[0]);.  if( r
19f70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19f80 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f      goto create_
19f90 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
19fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
19fb0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
19fc0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
19fd0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
19fe0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
19ff0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20 6c   ** variables, l
1a000 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69  ink the cursor i
1a010 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64  nto the BtShared
1a020 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a 70   list and set *p
1a030 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f  pCur (the.  ** o
1a040 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20 74  utput argument t
1a050 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 29  o this function)
1a060 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  ..  */.  pCur->p
1a070 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1a080 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
1a090 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
1a0a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
1a0b0 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28 75 38 29  r->wrFlag = (u8)
1a0c0 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e  wrFlag;.  pCur->
1a0d0 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
1a0e0 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72  rsor;.  if( pCur
1a0f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
1a100 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
1a110 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20  v = pCur;.  }.  
1a120 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
1a130 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
1a140 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
1a150 41 4c 49 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61  ALID;.  pCur->ca
1a160 63 68 65 64 52 6f 77 69 64 20 3d 20 30 3b 0a 0a  chedRowid = 0;..
1a170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a180 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73  OK;..create_curs
1a190 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
1a1a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1a1b0 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20  ->apPage[0]);.  
1a1c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1a1d0 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
1a1e0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
1a1f0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
1a200 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a230 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
1a240 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
1a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a270 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
1a280 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
1a290 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
1a2c0 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
1a2d0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
1a2e0 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
1a2f0 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1a300 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
1a310 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
1a320 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
1a330 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a350 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
1a360 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
1a370 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1a380 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
1a390 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  (p);.  rc = btre
1a3a0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
1a3b0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
1a3c0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
1a3d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1a3e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1a3f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1a400 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42   the size of a B
1a410 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1a420 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  n bytes..**.** T
1a430 68 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69  his interfaces i
1a440 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74  s needed so that
1a450 20 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72   users of cursor
1a460 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74  s can preallocat
1a470 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20  e.** sufficient 
1a480 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20  storage to hold 
1a490 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42  a cursor.  The B
1a4a0 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69  tCursor object i
1a4b0 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75  s opaque.** to u
1a4c0 73 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e  sers so they can
1a4d0 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f  not do the sizeo
1a4e0 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d  f() themselves -
1a4f0 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a   they must call.
1a500 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
1a510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1a520 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76  treeCursorSize(v
1a530 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  oid){.  return s
1a540 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 3b  izeof(BtCursor);
1a550 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1a560 65 20 63 61 63 68 65 64 20 72 6f 77 69 64 20 76  e cached rowid v
1a570 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 63 75  alue of every cu
1a580 72 73 6f 72 20 69 6e 20 74 68 65 20 73 61 6d 65  rsor in the same
1a590 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
1a5a0 2a 20 61 73 20 70 43 75 72 20 61 6e 64 20 68 61  * as pCur and ha
1a5b0 76 69 6e 67 20 74 68 65 20 73 61 6d 65 20 72 6f  ving the same ro
1a5c0 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  ot page number a
1a5d0 73 20 70 43 75 72 2e 20 20 54 68 65 20 76 61 6c  s pCur.  The val
1a5e0 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
1a5f0 69 52 6f 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  iRowid..**.** On
1a600 6c 79 20 70 6f 73 69 74 69 76 65 20 72 6f 77 69  ly positive rowi
1a610 64 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e  d values are con
1a620 73 69 64 65 72 65 64 20 76 61 6c 69 64 20 66 6f  sidered valid fo
1a630 72 20 74 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a  r this cache..**
1a640 20 54 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   The cache is in
1a650 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
1a660 6f 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  o, indicating an
1a670 20 69 6e 76 61 6c 69 64 20 63 61 63 68 65 2e 0a   invalid cache..
1a680 2a 2a 20 41 20 62 74 72 65 65 20 77 69 6c 6c 20  ** A btree will 
1a690 77 6f 72 6b 20 66 69 6e 65 20 77 69 74 68 20 7a  work fine with z
1a6a0 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20  ero or negative 
1a6b0 72 6f 77 69 64 73 2e 20 20 57 65 20 6a 75 73 74  rowids.  We just
1a6c0 20 63 61 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65   cannot.** cache
1a6d0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1a6e0 65 20 72 6f 77 69 64 73 2c 20 77 68 69 63 68 20  e rowids, which 
1a6f0 6d 65 61 6e 73 20 74 61 62 6c 65 73 20 74 68 61  means tables tha
1a700 74 20 75 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a  t use zero or.**
1a710 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69 64 73   negative rowids
1a720 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
1a730 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 42 75 74  tle slower.  But
1a740 20 69 6e 20 70 72 61 63 74 69 63 65 2c 20 7a 65   in practice, ze
1a750 72 6f 0a 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76  ro.** or negativ
1a760 65 20 72 6f 77 69 64 73 20 61 72 65 20 76 65 72  e rowids are ver
1a770 79 20 75 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68  y uncommon so th
1a780 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  is should not be
1a790 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76   a problem..*/.v
1a7a0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
1a7b0 53 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42  SetCachedRowid(B
1a7c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 73  tCursor *pCur, s
1a7d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 52 6f  qlite3_int64 iRo
1a7e0 77 69 64 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  wid){.  BtCursor
1a7f0 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75   *p;.  for(p=pCu
1a800 72 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  r->pBt->pCursor;
1a810 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
1a820 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f  .    if( p->pgno
1a830 52 6f 6f 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f  Root==pCur->pgno
1a840 52 6f 6f 74 20 29 20 70 2d 3e 63 61 63 68 65 64  Root ) p->cached
1a850 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
1a860 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1a870 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 3d  ur->cachedRowid=
1a880 3d 69 52 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a  =iRowid );.}../*
1a890 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1a8a0 61 63 68 65 64 20 72 6f 77 69 64 20 66 6f 72 20  ached rowid for 
1a8b0 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72  the given cursor
1a8c0 2e 20 20 41 20 6e 65 67 61 74 69 76 65 20 6f 72  .  A negative or
1a8d0 20 7a 65 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20   zero.** return 
1a8e0 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73 20  value indicates 
1a8f0 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 63  that the rowid c
1a900 61 63 68 65 20 69 73 20 69 6e 76 61 6c 69 64 20  ache is invalid 
1a910 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a  and should be.**
1a920 20 69 67 6e 6f 72 65 64 2e 20 20 49 66 20 74 68   ignored.  If th
1a930 65 20 72 6f 77 69 64 20 63 61 63 68 65 20 68 61  e rowid cache ha
1a940 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
1a950 65 65 6e 20 73 65 74 2c 20 74 68 65 6e 20 61 0a  een set, then a.
1a960 2a 2a 20 7a 65 72 6f 20 69 73 20 72 65 74 75 72  ** zero is retur
1a970 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
1a980 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74 72  int64 sqlite3Btr
1a990 65 65 47 65 74 43 61 63 68 65 64 52 6f 77 69 64  eeGetCachedRowid
1a9a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1a9b0 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d  {.  return pCur-
1a9c0 3e 63 61 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a  >cachedRowid;.}.
1a9d0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
1a9e0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
1a9f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1aa00 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
1aa10 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
1aa20 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
1aa30 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
1aa40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
1aa50 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
1aa60 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
1aa70 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
1aa80 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
1aa90 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
1aaa0 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
1aab0 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
1aac0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
1aad0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
1aae0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1aaf0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
1ab00 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70 43  Cur);.    if( pC
1ab10 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20  ur->pPrev ){.   
1ab20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e     pCur->pPrev->
1ab30 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
1ab40 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ext;.    }else{.
1ab50 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
1ab60 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
1ab70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ab80 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pCur->pNext ){. 
1ab90 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74       pCur->pNext
1aba0 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d 3e  ->pPrev = pCur->
1abb0 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20  pPrev;.    }.   
1abc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
1abd0 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
1abe0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1abf0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
1ac00 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
1ac10 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1ac20 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76 61  d(pBt);.    inva
1ac30 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1ac40 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20 2f  che(pCur);.    /
1ac50 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
1ac60 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
1ac70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1ac80 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
1ac90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1aca0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1acb0 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  _TEST./*.** Make
1acc0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72   a temporary cur
1acd0 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69  sor by filling i
1ace0 6e 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20  n the fields of 
1acf0 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65  pTempCur..** The
1ad00 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
1ad10 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20  r is not on the 
1ad20 63 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20  cursor list for 
1ad30 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f  the Btree..*/.vo
1ad40 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  id sqlite3BtreeG
1ad50 65 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43  etTempCursor(BtC
1ad60 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43  ursor *pCur, BtC
1ad70 75 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29  ursor *pTempCur)
1ad80 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  {.  int i;.  ass
1ad90 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ada0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1adb0 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
1adc0 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42  , pCur, sizeof(B
1add0 74 43 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65  tCursor));.  pTe
1ade0 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30  mpCur->pNext = 0
1adf0 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50  ;.  pTempCur->pP
1ae00 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  rev = 0;.  for(i
1ae10 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d  =0; i<=pTempCur-
1ae20 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
1ae30 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
1ae40 66 28 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61  f(pTempCur->apPa
1ae50 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b  ge[i]->pDbPage);
1ae60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1ae70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30  TempCur->pKey==0
1ae80 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   );.}.#endif /* 
1ae90 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a  SQLITE_TEST */..
1aea0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1aeb0 53 54 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ST./*.** Delete 
1aec0 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
1aed0 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
1aee0 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
1aef0 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
1af00 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
1af10 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  bove..*/.void sq
1af20 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
1af30 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
1af40 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
1af50 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
1af60 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1af70 28 70 43 75 72 29 20 29 3b 0a 20 20 66 6f 72 28  (pCur) );.  for(
1af80 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
1af90 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
1afa0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1afb0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d  (pCur->apPage[i]
1afc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
1afd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1afe0 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 23 65  Cur->pKey);.}.#e
1aff0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54  ndif /* SQLITE_T
1b000 45 53 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  EST */../*.** Ma
1b010 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
1b020 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
1b030 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
1b040 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
1b050 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
1b060 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
1b070 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
1b080 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
1b090 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
1b0a0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
1b0b0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
1b0c0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
1b0d0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
1b0e0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
1b0f0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
1b100 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
1b110 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
1b120 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
1b130 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
1b140 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36  )..**.** 2007-06
1b150 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61  -25:  There is a
1b160 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72   bug in some ver
1b170 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68  sions of MSVC th
1b180 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20  at cause the.** 
1b190 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73  compiler to cras
1b1a0 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e  h when getCellIn
1b1b0 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e  fo() is implemen
1b1c0 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a  ted as a macro..
1b1d0 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20  ** But there is 
1b1e0 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70  a measureable sp
1b1f0 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f  eed advantage to
1b200 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f   using the macro
1b210 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e   on gcc.** (when
1b220 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f   less compiler o
1b230 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b  ptimizations lik
1b240 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65  e -Os or -O0 are
1b250 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
1b260 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74   compiler is not
1b270 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65   doing agressive
1b280 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
1b290 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
1b2a0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
1b2b0 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
1b2c0 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
1b2d0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
1b2e0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
1b2f0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
1b300 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
1b310 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
1b320 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
1b330 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
1b340 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
1b350 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
1b360 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
1b370 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  nfo));.    sqlit
1b380 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1b390 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
1b3a0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
1b3b0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
1b3c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
1b3d0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
1b3e0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
1b3f0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
1b400 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
1b410 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
1b420 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
1b430 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
1b440 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
1b450 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
1b460 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
1b470 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
1b480 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
1b490 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
1b4a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1b4b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
1b4c0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
1b4d0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1b4e0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
1b4f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
1b500 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
1b510 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
1b520 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
1b530 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
1b540 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1b550 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
1b560 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1b570 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b580 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
1b590 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
1b5a0 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
1b5b0 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
1b5c0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
1b5d0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
1b5e0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
1b5f0 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
1b600 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
1b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
1b650 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b690 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
1b6a0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6e0 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42    \.    sqlite3B
1b6f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1b700 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1b710 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
1b720 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
1b730 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
1b740 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
1b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b780 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
1b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7d0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
1b7e0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
1b830 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
1b840 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
1b850 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
1b860 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
1b870 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
1b880 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
1b890 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
1b8a0 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
1b8b0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1b8c0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
1b8d0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
1b8e0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
1b8f0 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
1b900 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
1b910 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
1b920 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
1b930 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
1b940 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
1b950 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1b960 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
1b970 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b980 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
1b990 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
1b9a0 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
1b9b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b9c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b9d0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1b9e0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1b9f0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1ba00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ba10 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ba20 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ba30 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
1ba40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1ba50 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
1ba60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1ba70 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
1ba80 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
1ba90 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1baa0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
1bab0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
1bac0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
1bad0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
1bae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1baf0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
1bb00 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
1bb10 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
1bb20 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
1bb30 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
1bb40 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
1bb50 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
1bb60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
1bb70 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
1bb80 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
1bb90 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
1bba0 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
1bbb0 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
1bbc0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
1bbd0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
1bbe0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
1bbf0 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
1bc00 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
1bc10 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
1bc20 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
1bc30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1bc40 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
1bc50 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1bc60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1bc70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
1bc80 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
1bc90 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
1bca0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1bcb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
1bcc0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1bcd0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bce0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
1bcf0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1bd00 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
1bd10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1bd20 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1bd30 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
1bd40 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
1bd50 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
1bd60 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
1bd70 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
1bd80 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
1bd90 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1bda0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
1bdb0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
1bdc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bdd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
1bde0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
1bdf0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
1be00 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
1be10 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
1be20 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
1be30 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
1be40 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1be50 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
1be60 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
1be70 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
1be80 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
1be90 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
1bea0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
1beb0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
1bec0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
1bed0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
1bee0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
1bef0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
1bf00 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1bf10 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
1bf20 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1bf30 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
1bf40 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
1bf50 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
1bf60 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
1bf70 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
1bf80 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
1bf90 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
1bfa0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
1bfb0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
1bfc0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
1bfd0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
1bfe0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
1bff0 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
1c000 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
1c010 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
1c020 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
1c030 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
1c040 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
1c050 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
1c060 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
1c070 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
1c080 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
1c090 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
1c0a0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
1c0b0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1c0c0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
1c0d0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
1c0e0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
1c0f0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
1c100 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
1c110 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
1c120 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
1c130 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
1c140 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1c150 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
1c160 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
1c170 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1c180 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
1c190 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
1c1a0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
1c1b0 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
1c1c0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
1c1d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
1c1e0 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
1c1f0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1c200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1c210 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
1c220 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
1c230 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
1c240 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
1c250 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
1c260 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
1c270 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
1c280 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
1c290 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
1c2a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c2b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
1c2c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1c2d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1c2e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
1c2f0 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
1c300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1c310 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
1c320 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
1c330 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
1c340 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
1c350 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
1c360 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
1c370 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
1c380 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
1c390 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
1c3a0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
1c3b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
1c3c0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
1c3d0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
1c3e0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
1c3f0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
1c400 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
1c410 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
1c420 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
1c430 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
1c440 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
1c450 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
1c460 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
1c470 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
1c480 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
1c490 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
1c4a0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
1c4b0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
1c4c0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
1c4d0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
1c4e0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1c4f0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
1c500 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
1c510 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
1c520 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
1c530 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
1c540 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
1c550 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
1c560 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c570 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
1c580 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1c590 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
1c5a0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
1c5b0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
1c5c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
1c5d0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
1c5e0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
1c5f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c600 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1c610 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1c620 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
1c630 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ge, 0);.    asse
1c640 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
1c650 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20   || pPage==0);. 
1c660 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26     if( next==0 &
1c670 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
1c680 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
1c690 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1c6a0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
1c6b0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
1c6c0 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
1c6d0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
1c6e0 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
1c6f0 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
1c700 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1c710 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
1c720 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
1c730 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
1c740 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
1c750 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1c760 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
1c770 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
1c780 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
1c790 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
1c7a0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
1c7b0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
1c7c0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
1c7d0 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
1c7e0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
1c7f0 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
1c800 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
1c810 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
1c820 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
1c830 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
1c840 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
1c850 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
1c860 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1c870 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
1c880 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
1c890 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
1c8a0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
1c8b0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
1c8c0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
1c8d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1c8e0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
1c8f0 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
1c900 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
1c910 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
1c920 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
1c930 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
1c940 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
1c950 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
1c960 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1c970 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1c980 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
1c990 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c9b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
1c9c0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
1c9d0 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
1c9e0 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
1c9f0 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
1ca00 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
1ca10 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
1ca20 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
1ca30 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
1ca40 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
1ca50 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
1ca60 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1ca70 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
1ca80 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
1ca90 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
1caa0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
1cab0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
1cac0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1cad0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cae0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1caf0 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
1cb00 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
1cb10 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
1cb20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
1cb30 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
1cb40 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
1cb50 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
1cb60 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
1cb70 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
1cb80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cb90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1cba0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
1cbb0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
1cbc0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
1cbd0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
1cbe0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
1cbf0 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
1cc00 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1cc10 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
1cc20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
1cc30 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
1cc40 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
1cc50 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
1cc60 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
1cc70 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
1cc80 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
1cc90 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
1cca0 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
1ccb0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
1ccc0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
1ccd0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
1cce0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
1ccf0 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
1cd00 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
1cd10 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
1cd20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1cd30 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
1cd40 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65  a distinction be
1cd50 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  tween key and da
1cd60 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72  ta..** It just r
1cd70 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62  eads or writes b
1cd80 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ytes from the pa
1cd90 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74  yload area.  Dat
1cda0 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65  a might .** appe
1cdb0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
1cdc0 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65  age or be scatte
1cdd0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
1cde0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ple overflow .**
1cdf0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
1ce00 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
1ce10 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1ce20 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
1ce30 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
1ce40 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
1ce50 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
1ce60 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
1ce70 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
1ce80 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
1ce90 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
1cea0 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
1ceb0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
1cec0 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
1ced0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
1cee0 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
1cef0 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
1cf00 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
1cf10 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
1cf20 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
1cf30 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
1cf40 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
1cf50 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1cf60 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1cf70 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
1cf80 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
1cf90 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
1cfa0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
1cfb0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
1cfc0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
1cfd0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
1cfe0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
1cff0 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
1d000 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
1d010 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
1d020 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
1d030 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
1d040 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1d050 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
1d060 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
1d070 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
1d080 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
1d090 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
1d0a0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
1d0b0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
1d0c0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
1d0d0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
1d0e0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
1d0f0 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
1d100 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1d110 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1d120 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1d130 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1d140 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
1d150 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
1d160 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
1d170 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
1d180 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d1a0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
1d1b0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
1d1c0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
1d1d0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
1d1e0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
1d1f0 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
1d200 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  pKey,         /*
1d210 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
1d220 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
1d230 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
1d240 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
1d250 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
1d260 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
1d270 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
1d280 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
1d290 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
1d2a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
1d2b0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
1d2c0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
1d2d0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
1d2e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d2f0 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
1d300 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
1d310 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
1d320 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1d330 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
1d340 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
1d350 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
1d360 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
1d370 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
1d380 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1d390 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1d3a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1d3b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1d3c0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
1d3d0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
1d3e0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1d3f0 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
1d400 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
1d410 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
1d420 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
1d430 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
1d440 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
1d450 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
1d460 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
1d470 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
1d480 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
1d490 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b   offset += nKey;
1d4a0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
1d4b0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
1d4c0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a 20  r->info.nData . 
1d4d0 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
1d4e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1d4f0 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1d500 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1d510 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1d520 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1d530 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1d540 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1d550 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1d560 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d570 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1d580 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1d590 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1d5a0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1d5b0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1d5c0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1d5d0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1d5e0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1d5f0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1d600 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1d610 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1d620 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1d630 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1d640 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1d650 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1d660 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1d670 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1d680 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1d690 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1d6a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1d6b0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1d6c0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1d6d0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1d6e0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1d6f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1d700 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1d710 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1d720 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1d730 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1d740 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1d750 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1d760 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1d770 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1d780 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1d790 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1d7a0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1d7b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1d7c0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1d7d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1d7e0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1d7f0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1d800 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1d810 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1d820 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1d830 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1d840 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1d850 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1d860 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1d870 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1d880 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1d890 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1d8a0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1d8b0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1d8c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1d8d0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1d8e0 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1d8f0 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1d900 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1d910 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1d920 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1d930 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1d940 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1d950 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1d960 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1d970 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1d980 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1d990 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1d9a0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1d9b0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1d9c0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1d9d0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1d9e0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1d9f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1da00 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1da10 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1da20 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1da30 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20     if( nOvfl && 
1da40 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1da50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1da60 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1da70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1da80 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
1da90 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1daa0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1dab0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
1dac0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
1dad0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
1dae0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
1daf0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
1db00 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
1db10 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
1db20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1db30 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
1db40 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
1db50 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
1db60 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
1db70 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
1db80 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1db90 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1dba0 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
1dbb0 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
1dbc0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
1dbd0 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
1dbe0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1dbf0 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
1dc00 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
1dc10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dc20 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1dc30 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
1dc40 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
1dc50 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1dc60 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
1dc70 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1dc80 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1dc90 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
1dca0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
1dcb0 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
1dcc0 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
1dcd0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
1dce0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1dcf0 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
1dd00 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1dd10 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
1dd20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1dd30 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
1dd40 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
1dd50 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
1dd60 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
1dd70 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1dd80 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
1dd90 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1dda0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
1ddb0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
1ddc0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
1ddd0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
1dde0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
1ddf0 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
1de00 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
1de10 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
1de20 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
1de30 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
1de40 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
1de50 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
1de60 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1de70 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1de80 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
1de90 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1dea0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1deb0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
1dec0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1ded0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1dee0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
1def0 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
1df00 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
1df10 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
1df20 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
1df30 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
1df40 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
1df50 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
1df60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1df70 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
1df80 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
1df90 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
1dfa0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
1dfb0 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
1dfc0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
1dfd0 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
1dfe0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
1dff0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
1e000 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
1e010 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
1e020 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1e030 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e040 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
1e050 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
1e060 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
1e070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e090 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
1e0a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1e0b0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
1e0c0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1e0d0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
1e0e0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
1e0f0 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
1e100 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1e110 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
1e120 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1e130 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e140 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
1e150 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1e160 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
1e170 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
1e180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1e190 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1e1a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e1b0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1e1c0 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
1e1d0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
1e1e0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
1e1f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1e200 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1e210 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1e220 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e230 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e240 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
1e250 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e260 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1e270 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
1e280 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1e290 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1e2a0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1e2b0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1e2c0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1e2d0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1e2e0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1e2f0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1e300 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1e310 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1e320 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1e330 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1e340 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1e350 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1e360 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1e370 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1e380 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1e390 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1e3a0 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
1e3b0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1e3c0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1e3d0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  f){.  int rc;.. 
1e3e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1e3f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1e400 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1e410 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1e420 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1e430 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e440 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e450 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1e460 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1e470 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1e480 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1e490 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1e4a0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1e4b0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1e4c0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
1e4d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e4e0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1e4f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e500 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1e510 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1e520 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1e530 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1e540 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1e550 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1e560 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1e570 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20  )pBuf, 0, 0);.  
1e580 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1e590 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1e5a0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
1e5b0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
1e5c0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
1e5d0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
1e5e0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
1e5f0 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
1e600 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
1e610 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
1e620 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
1e630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1e640 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
1e650 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1e660 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1e670 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
1e680 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
1e690 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
1e6a0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
1e6b0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
1e6c0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
1e6d0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
1e6e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1e6f0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1e700 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1e710 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
1e720 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1e730 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
1e740 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e750 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1e760 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e770 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
1e780 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
1e790 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1e7a0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1e7b0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1e7c0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1e7d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e7e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1e7f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e800 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1e810 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1e820 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1e830 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e840 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
1e850 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1e860 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1e870 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1e880 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1e890 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
1e8a0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
1e8b0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
1e8c0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
1e8d0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1e8e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1e8f0 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
1e900 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
1e910 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1e920 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
1e930 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
1e940 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
1e950 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1e960 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
1e970 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
1e980 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
1e990 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1e9a0 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
1e9b0 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
1e9c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
1e9d0 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
1e9e0 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
1e9f0 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
1ea00 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
1ea10 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1ea20 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
1ea30 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
1ea40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ea50 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
1ea60 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
1ea70 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
1ea80 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
1ea90 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
1eaa0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
1eab0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
1eac0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
1ead0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
1eae0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
1eaf0 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
1eb00 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
1eb10 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
1eb20 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
1eb30 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
1eb40 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
1eb50 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
1eb60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1eb70 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
1eb80 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
1eb90 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
1eba0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
1ebb0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
1ebc0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
1ebd0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
1ebe0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
1ebf0 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
1ec00 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
1ec10 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
1ec20 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
1ec30 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
1ec40 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
1ec50 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
1ec60 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
1ec70 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
1ec80 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
1ec90 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1eca0 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
1ecb0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1ecc0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1ecd0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1ece0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1ecf0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
1ed00 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
1ed10 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
1ed20 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1ed30 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
1ed40 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
1ed50 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
1ed60 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
1ed70 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
1ed80 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1ed90 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1eda0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1edb0 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
1edc0 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  u32 nLocal;..  a
1edd0 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
1ede0 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
1edf0 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1ee00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
1ee10 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1ee20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1ee30 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1ee40 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ee50 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
1ee60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1ee70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1ee80 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ee90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1eea0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1eeb0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1eec0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1eed0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1eee0 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
1eef0 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
1ef00 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
1ef10 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1ef20 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
1ef30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
1ef40 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
1ef50 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
1ef60 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1ef70 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
1ef80 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
1ef90 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1efa0 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
1efb0 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
1efc0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1efd0 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63  al;.    if( nLoc
1efe0 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  al>nKey ){.     
1eff0 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a   nLocal = nKey;.
1f000 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d      }.  }.  *pAm
1f010 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
1f020 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
1f030 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
1f040 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
1f050 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
1f060 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
1f070 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
1f080 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
1f090 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
1f0a0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
1f0b0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
1f0c0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
1f0d0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
1f0e0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
1f0f0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1f100 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
1f110 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
1f120 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
1f130 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
1f140 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
1f150 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
1f160 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
1f170 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
1f180 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
1f190 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
1f1a0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
1f1b0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
1f1c0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
1f1d0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
1f1e0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
1f1f0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
1f200 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
1f210 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
1f220 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
1f230 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
1f240 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1f250 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
1f260 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
1f270 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
1f280 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
1f290 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
1f2a0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
1f2b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1f2c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f2d0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1f2e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1f2f0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1f300 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1f310 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1f320 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1f330 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
1f340 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
1f350 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
1f360 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
1f370 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74  eturn 0;.}.const
1f380 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
1f390 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
1f3a0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1f3b0 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
1f3c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1f3d0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1f3e0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1f3f0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
1f400 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1f410 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1f420 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1f430 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1f440 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1f450 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1f460 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
1f470 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1f480 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1f490 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1f4a0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
1f4b0 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
1f4c0 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
1f4d0 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1f4e0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
1f4f0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a   to move to..*/.
1f500 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1f510 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
1f520 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
1f530 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
1f540 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
1f550 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
1f560 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
1f570 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1f580 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
1f590 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1f5a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1f5b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1f5c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1f5d0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1f5e0 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
1f5f0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
1f600 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
1f610 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
1f620 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
1f630 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f640 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1f650 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
1f660 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
1f670 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29  Pgno, &pNewPage)
1f680 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1f690 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  urn rc;.  pCur->
1f6a0 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e  apPage[i+1] = pN
1f6b0 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
1f6c0 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a  aiIdx[i+1] = 0;.
1f6d0 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
1f6e0 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
1f6f0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1f700 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1f710 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
1f720 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
1f730 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f740 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1f750 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f760 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
1f770 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
1f780 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
1f790 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
1f7a0 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
1f7b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
1f7c0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
1f7d0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1f7e0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
1f7f0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
1f800 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
1f810 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
1f820 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
1f830 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
1f840 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
1f850 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
1f860 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1f870 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
1f880 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
1f890 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1f8a0 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
1f8b0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
1f8c0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
1f8d0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
1f8e0 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
1f8f0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
1f900 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
1f910 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
1f920 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
1f930 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
1f940 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
1f950 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
1f960 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
1f970 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
1f980 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1f990 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
1f9a0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
1f9b0 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
1f9c0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1f9d0 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
1f9e0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1f9f0 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
1fa00 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
1fa10 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
1fa20 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
1fa30 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
1fa40 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
1fa50 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
1fa60 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1fa70 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
1fa80 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
1fa90 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
1faa0 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
1fab0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
1fac0 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
1fad0 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
1fae0 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  ell index..*/.vo
1faf0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  id sqlite3BtreeM
1fb00 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
1fb10 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1fb20 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1fb30 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1fb40 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1fb50 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1fb60 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1fb70 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
1fb80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1fb90 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1fba0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1fbb0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
1fbc0 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
1fbd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
1fbe0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
1fbf0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
1fc00 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
1fc10 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1fc20 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65  ->pgno.  );.  re
1fc30 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1fc40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1fc50 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
1fc60 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
1fc70 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1fc80 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1fc90 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
1fca0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1fcb0 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  o the root page.
1fcc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1fcd0 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
1fce0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
1fcf0 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
1fd00 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1fd10 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
1fd20 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
1fd30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1fd40 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
1fd50 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1fd60 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1fd70 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
1fd80 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
1fd90 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
1fda0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
1fdb0 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
1fdc0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1fdd0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
1fde0 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
1fdf0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1fe00 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1fe10 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
1fe20 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
1fe30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1fe40 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
1fe50 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
1fe60 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20  ->skip;.    }.  
1fe70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1fe80 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1fe90 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
1fea0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
1feb0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1fec0 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
1fed0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1fee0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1fef0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1ff00 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1ff10 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1ff20 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1ff30 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1ff40 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1ff50 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
1ff60 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  [0])).    ){.   
1ff70 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1ff80 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1ff90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1ffa0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1ffb0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
1ffc0 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
1ffd0 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
1ffe0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1fff0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
20000 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  = 0;.  pCur->aiI
20010 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
20020 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
20030 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73  0;.  pCur->atLas
20040 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  t = 0;.  pCur->v
20050 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
20060 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
20070 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
20080 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
20090 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
200a0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
200b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
200c0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
200d0 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74     assert( pRoot
200e0 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20  ->pgno==1 );.   
200f0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
20100 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
20110 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
20120 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65  et+8]);.    asse
20130 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29 3b  rt( subpage>0 );
20140 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
20150 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
20160 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
20170 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
20180 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
20190 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
201a0 20 3d 20 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c   = ((pRoot->nCel
201b0 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
201c0 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
201d0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
201e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
201f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
20200 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
20210 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
20220 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
20230 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
20240 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
20250 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
20260 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
20270 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
20280 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
20290 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
202a0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
202b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
202c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
202d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
202e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
202f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20300 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
20310 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
20320 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20330 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20340 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
20350 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
20360 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
20370 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
20380 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
20390 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
203a0 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61  )->leaf ){.    a
203b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
203c0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
203d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
203e0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
203f0 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
20400 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge, pCur->aiIdx[
20410 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a  pCur->iPage]));.
20420 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
20430 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
20440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20450 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
20460 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
20470 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
20480 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
20490 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
204a0 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
204b0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
204c0 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
204d0 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
204e0 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
204f0 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
20500 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
20510 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
20520 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
20530 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
20540 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
20550 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
20560 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
20570 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
20580 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
20590 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
205a0 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
205b0 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
205c0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
205d0 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
205e0 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
205f0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
20600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
20610 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
20620 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
20630 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
20640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20650 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
20660 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
20670 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
20680 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
20690 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
206a0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
206b0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
206c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
206d0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
206e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
206f0 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
20700 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
20710 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
20720 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
20730 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
20740 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
20750 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
20760 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
20770 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
20780 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
20790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
207a0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
207b0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
207c0 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
207d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
207e0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
207f0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
20800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20810 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
20820 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
20830 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
20840 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
20850 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
20860 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
20870 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
20880 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
20890 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
208a0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
208b0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
208c0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
208d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
208e0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
208f0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
20900 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
20910 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
20920 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
20930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20940 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20950 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
20960 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
20970 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
20980 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
20990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
209a0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
209b0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
209c0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
209d0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
209e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
209f0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
20a00 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
20a10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20a20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20a30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20a40 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20a50 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
20a60 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
20a70 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
20a80 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
20a90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
20aa0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
20ab0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
20ac0 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
20ad0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
20ae0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
20af0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
20b00 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
20b10 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
20b20 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
20b30 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
20b40 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
20b50 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
20b60 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
20b70 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
20b80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
20b90 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
20ba0 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
20bb0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
20bc0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
20bd0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20be0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
20bf0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
20c00 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
20c10 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20   cursor already 
20c20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
20c30 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69  st entry, this i
20c40 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20  s a no-op. */.  
20c50 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  if( CURSOR_VALID
20c60 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26  ==pCur->eState &
20c70 26 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 29  & pCur->atLast )
20c80 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
20c90 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69  DEBUG.    /* Thi
20ca0 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74  s block serves t
20cb0 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20  o assert() that 
20cc0 74 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c  the cursor reall
20cd0 79 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20  y does point .  
20ce0 20 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74    ** to the last
20cf0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d   entry in the b-
20d00 74 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  tree. */.    int
20d10 20 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d   ii;.    for(ii=
20d20 30 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67  0; ii<pCur->iPag
20d30 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  e; ii++){.      
20d40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
20d50 49 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61  Idx[ii]==pCur->a
20d60 70 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c  pPage[ii]->nCell
20d70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
20d80 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
20d90 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
20da0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20db0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
20dc0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
20dd0 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
20de0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61  Cur->iPage]->lea
20df0 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  f );.#endif.    
20e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20e10 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f  ;.  }..  rc = mo
20e20 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
20e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20e40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43  _OK ){.    if( C
20e50 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
20e60 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
20e70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
20e80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20e90 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
20ea0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
20eb0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
20ec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
20ed0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
20ee0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
20ef0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
20f00 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
20f10 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
20f20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73       pCur->atLas
20f30 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  t = rc==SQLITE_O
20f40 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20  K ?1:0;.    }.  
20f50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20f60 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
20f70 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
20f80 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
20f90 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
20fa0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
20fb0 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
20fc0 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
20fd0 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
20fe0 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
20ff0 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
21000 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
21010 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
21020 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
21030 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
21040 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
21050 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
21060 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
21070 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
21080 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
21090 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
210a0 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
210b0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
210c0 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
210d0 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
210e0 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
210f0 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
21100 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
21110 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
21120 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
21130 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
21140 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
21150 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
21160 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
21170 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
21180 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
21190 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
211a0 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
211b0 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
211c0 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
211d0 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
211e0 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
211f0 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
21200 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
21210 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
21220 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
21230 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
21240 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
21250 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
21260 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
21270 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
21280 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
21290 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
212a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
212b0 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
212c0 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
212d0 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
212e0 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
212f0 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
21300 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
21310 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
21320 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
21350 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
21360 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
21370 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
21380 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
21390 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
213a0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
213b0 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
213c0 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
213d0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74  dxKey..**.*/.int
213e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
213f0 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
21400 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
21410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
21420 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
21430 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
21440 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
21450 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
21460 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
21470 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
21480 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
21490 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
214a0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
214b0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
214c0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
214d0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
214e0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21500 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
21510 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
21520 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
21530 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
21540 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
21550 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
21560 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
21570 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
21580 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
21590 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
215a0 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65  lready positione
215b0 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77  d at the point w
215c0 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a  e are trying.  *
215d0 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68  * to move to, th
215e0 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77  en just return w
215f0 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
21600 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70   work */.  if( p
21610 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
21620 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75  SOR_VALID && pCu
21630 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20  r->validNKey .  
21640 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
21650 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29  [0]->intKey .  )
21660 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
21670 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
21680 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
21690 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
216a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
216b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
216c0 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72  ->atLast && pCur
216d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
216e0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
216f0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
21700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21710 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20      }.  }..  rc 
21720 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
21730 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
21740 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21750 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
21760 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
21770 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
21780 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
21790 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
217a0 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70  sInit );.  if( p
217b0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
217c0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
217d0 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
217e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
217f0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
21800 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
21810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
21820 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
21830 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
21840 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
21850 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
21860 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
21870 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e  wr, upr;.    Pgn
21880 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
21890 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
218a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
218b0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e  ->iPage];.    in
218c0 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
218d0 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
218e0 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
218f0 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
21900 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
21910 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
21920 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
21930 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78  ->intKey && pIdx
21940 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30  Key==0) || upr<0
21950 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
21960 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
21970 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
21980 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
21990 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73    }.    if( bias
219a0 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
219b0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
219c0 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75  >iPage] = (u16)u
219d0 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
219e0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
219f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
21a00 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f  (u16)((upr+lwr)/
21a10 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  2);.    }.    fo
21a20 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74  r(;;){.      int
21a30 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
21a40 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
21a50 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 75 72   /* Index of cur
21a60 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61  rent cell in pPa
21a70 67 65 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a  ge */.      u8 *
21a80 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
21ab0 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
21ac0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43  age */..      pC
21ad0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
21ae0 20 30 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   0;.      pCell 
21af0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
21b00 2c 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e  , idx) + pPage->
21b10 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
21b20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
21b30 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
21b40 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
21b50 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
21b60 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
21b70 20 20 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79         u32 dummy
21b80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  ;.          pCel
21b90 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  l += getVarint32
21ba0 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a  (pCell, dummy);.
21bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21bc0 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
21bd0 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
21be0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
21bf0 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
21c00 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
21c10 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
21c20 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
21c30 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
21c40 20 20 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20       c = -1;.   
21c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
21c70 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b  ellKey>intKey );
21c80 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b  .          c = +
21c90 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
21ca0 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64       pCur->valid
21cb0 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  NKey = 1;.      
21cc0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
21cd0 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
21ce0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21cf0 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
21d00 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65  m supported page
21d10 2d 73 69 7a 65 20 69 73 20 33 32 37 36 38 20 62  -size is 32768 b
21d20 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73  ytes. This means
21d30 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
21d40 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
21d50 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79  ber of record by
21d60 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e  tes stored on an
21d70 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20   index B-Tree.  
21d80 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73        ** page is
21d90 20 61 74 20 6d 6f 73 74 20 38 31 39 38 20 62 79   at most 8198 by
21da0 74 65 73 2c 20 77 68 69 63 68 20 6d 61 79 20 62  tes, which may b
21db0 65 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d  e stored as a 2-
21dc0 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  byte.        ** 
21dd0 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66  varint. This inf
21de0 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
21df0 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61   to attempt to a
21e00 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20  void parsing .  
21e10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74        ** the ent
21e20 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63  ire cell by chec
21e30 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73  king for the cas
21e40 65 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63  es where the rec
21e50 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20  ord is .        
21e60 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65  ** stored entire
21e70 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d  ly within the b-
21e80 74 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73  tree page by ins
21e90 70 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73  pecting the firs
21ea0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20  t .        ** 2 
21eb0 62 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c  bytes of the cel
21ec0 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  l..        */.  
21ed0 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20        int nCell 
21ee0 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
21ef0 20 20 20 20 69 66 28 20 21 28 6e 43 65 6c 6c 20      if( !(nCell 
21f00 26 20 30 78 38 30 29 20 26 26 20 6e 43 65 6c 6c  & 0x80) && nCell
21f10 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
21f20 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
21f30 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75  * This branch ru
21f40 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  ns if the record
21f50 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74  -size field of t
21f60 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20  he cell is a.   
21f70 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65         ** single
21f80 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
21f90 20 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73   the record fits
21fa0 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65   entirely on the
21fb0 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20   main.          
21fc0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
21fd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20   */.          c 
21fe0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
21ff0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
22000 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
22010 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
22020 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
22030 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
22040 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
22050 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
22060 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
22070 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
22080 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
22090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
220a0 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
220b0 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
220c0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
220d0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
220e0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
220f0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
22100 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
22110 2f 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  /.          c = 
22120 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22130 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
22140 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
22150 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
22160 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22170 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
22180 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
22190 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
221a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
221b0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
221c0 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
221d0 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
221e0 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
221f0 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
22200 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
22210 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
22220 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
22230 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
22240 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
22250 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
22260 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
22270 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
22280 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
22290 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
222a0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
222b0 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
222c0 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
222d0 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
222e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
222f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
22300 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
22310 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
22320 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
22330 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
22340 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
22350 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
22360 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
22370 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ll );.          
22380 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
22390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
223a0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
223b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
223c0 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
223d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
223e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
223f0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
22400 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
22410 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
22420 4b 65 79 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Key, 0, 0);.    
22430 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65        c = sqlite
22440 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
22450 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b  re(nCell, pCellK
22460 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
22470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22480 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
22490 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
224a0 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
224b0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
224c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
224d0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
224e0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
224f0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
22500 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  leaf ){.        
22510 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
22520 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
22530 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
22540 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
22550 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
22560 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
22570 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22580 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67  _OK;.          g
22590 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
225a0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
225b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
225c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77  <0 ){.        lw
225d0 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
225e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
225f0 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
22600 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c     }.      if( l
22610 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20  wr>upr ){.      
22620 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
22630 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49  .      pCur->aiI
22640 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
22650 3d 20 28 75 31 36 29 28 28 6c 77 72 2b 75 70 72  = (u16)((lwr+upr
22660 29 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )/2);.    }.    
22670 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
22680 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +1 );.    assert
22690 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
226a0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
226b0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
226c0 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20 20  chldPg = 0;.    
226d0 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 70  }else if( lwr>=p
226e0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
226f0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
22700 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
22710 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
22720 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
22730 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c 64  else{.      chld
22740 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  Pg = get4byte(fi
22750 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77  ndCell(pPage, lw
22760 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  r));.    }.    i
22770 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a  f( chldPg==0 ){.
22780 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
22790 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
227a0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
227b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
227c0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
227d0 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
227e0 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
227f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
22800 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
22810 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
22820 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
22830 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
22840 29 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e  )lwr;.    pCur->
22850 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
22860 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
22870 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
22880 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
22890 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
228a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
228b0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
228c0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
228d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
228e0 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76  ./*.** In this v
228f0 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d  ersion of BtreeM
22900 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20 61  oveto, pKey is a
22910 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72 65   packed index re
22920 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73 20  cord.** such as 
22930 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  is generated by 
22940 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
22950 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61 63  d opcode.  Unpac
22960 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20  k the.** record 
22970 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42 74  and then call Bt
22980 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
22990 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  d() to do the wo
229a0 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rk..*/.int sqlit
229b0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20  e3BtreeMoveto(. 
229c0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
229d0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f       /* Cursor o
229e0 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65 65  pen on the btree
229f0 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20   to be searched 
22a00 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
22a10 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b  *pKey,   /* Pack
22a20 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62 74  ed key if the bt
22a30 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ree is an index 
22a40 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20  */.  i64 nKey,  
22a50 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
22a60 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  ger key for tabl
22a70 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b 65  es.  Size of pKe
22a80 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f  y for indices */
22a90 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20 20  .  int bias,    
22aa0 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20 73         /* Bias s
22ab0 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
22ac0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
22ad0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 2f  pRes           /
22ae0 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72  * Write search r
22af0 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29  esults here */.)
22b00 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b20 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a 2f  * Status code */
22b30 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
22b40 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a  d *pIdxKey;   /*
22b50 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20   Unpacked index 
22b60 6b 65 79 20 2a 2f 0a 20 20 63 68 61 72 20 61 53  key */.  char aS
22b70 70 61 63 65 5b 31 35 30 5d 3b 20 20 20 20 20 20  pace[150];      
22b80 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 70 61 63      /* Temp spac
22b90 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d 20  e for pIdxKey - 
22ba0 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f  to avoid a mallo
22bb0 63 20 2a 2f 0a 0a 0a 20 20 69 66 28 20 70 4b 65  c */...  if( pKe
22bc0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
22bd0 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74   nKey==(i64)(int
22be0 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64  )nKey );.    pId
22bf0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64  xKey = sqlite3Vd
22c00 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70  beRecordUnpack(p
22c10 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28  Cur->pKeyInfo, (
22c20 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a  int)nKey, pKey,.
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69        aSpace, si
22c60 7a 65 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20  zeof(aSpace));. 
22c70 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d     if( pIdxKey==
22c80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
22c90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65  E_NOMEM;.  }else
22ca0 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20  {.    pIdxKey = 
22cb0 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  0;.  }.  rc = sq
22cc0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
22cd0 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70  Unpacked(pCur, p
22ce0 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69  IdxKey, nKey, bi
22cf0 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28  as, pRes);.  if(
22d00 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c   pKey ){.    sql
22d10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
22d20 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 49 64  packedRecord(pId
22d30 78 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  xKey);.  }.  ret
22d40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
22d50 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
22d60 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e   the cursor is n
22d70 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ot pointing at a
22d80 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74  n entry of the t
22d90 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45  able..**.** TRUE
22da0 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
22db0 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  d after a call t
22dc0 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  o sqlite3BtreeNe
22dd0 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61  xt() moves.** pa
22de0 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  st the last entr
22df0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f  y in the table o
22e00 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  r sqlite3BtreePr
22e10 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a  ev() moves past.
22e20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  ** the first ent
22e30 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73  ry.  TRUE is als
22e40 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  o returned if th
22e50 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
22e60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22e70 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f  BtreeEof(BtCurso
22e80 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
22e90 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65  ODO: What if the
22ea0 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55   cursor is in CU
22eb0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
22ec0 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65   but all table e
22ed0 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65  ntries.  ** have
22ee0 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54   been deleted? T
22ef0 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65  his API will nee
22f00 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72  d to change to r
22f10 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
22f20 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c  ode.  ** as well
22f30 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20   as the boolean 
22f40 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20  result value..  
22f50 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52  */.  return (CUR
22f60 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d  SOR_VALID!=pCur-
22f70 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a  >eState);.}../*.
22f80 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
22f90 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
22fa0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
22fb0 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
22fc0 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
22fd0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
22fe0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
22ff0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
23000 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
23010 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
23020 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
23030 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
23040 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
23050 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
23060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
23070 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
23080 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
23090 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
230a0 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
230b0 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
230c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
230d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
230e0 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
230f0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
23100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
23110 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
23120 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
23130 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
23140 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
23150 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
23160 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
23170 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
23180 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
23190 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20  f( pCur->skip>0 
231a0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
231b0 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
231c0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
231d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
231e0 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
231f0 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
23200 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
23210 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
23220 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
23230 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
23240 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
23250 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
23260 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65   idx<=pPage->nCe
23270 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
23280 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
23290 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
232a0 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
232b0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
232c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
232d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
232e0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
232f0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
23300 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
23310 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
23320 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
23330 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23340 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
23350 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
23360 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
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 64 6f 7b 0a 20  .    }.    do{. 
23390 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
233a0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
233b0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
233c0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
233d0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
233e0 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
233f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23400 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
23410 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
23420 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
23430 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
23440 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
23450 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
23460 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
23470 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
23480 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
23490 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
234a0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
234b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
234c0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
234d0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
234e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
234f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23500 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
23510 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
23520 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
23530 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
23540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23550 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
23560 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
23570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23580 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
23590 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
235a0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
235b0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
235c0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
235d0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
235e0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
235f0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
23600 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
23610 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
23620 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
23630 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
23640 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
23650 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
23660 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
23670 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23680 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
23690 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
236a0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
236b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
236c0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
236d0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
236e0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
236f0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
23700 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
23710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23720 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23730 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
23740 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
23750 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
23760 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
23770 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
23780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23790 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
237a0 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
237b0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
237c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
237d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
237e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
237f0 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
23800 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
23810 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
23820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
23830 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
23840 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
23850 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
23860 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
23870 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
23880 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
23890 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
238a0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
238b0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
238c0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
238d0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
238e0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
238f0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
23900 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
23910 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
23920 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
23930 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
23940 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
23950 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
23960 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
23970 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
23980 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
23990 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
239a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
239b0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
239c0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
239d0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
239e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
239f0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
23a00 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
23a10 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
23a20 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
23a30 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
23a40 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
23a50 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
23a60 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
23a70 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
23a80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
23a90 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
23aa0 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
23ab0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23ac0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
23ad0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
23ae0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23af0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
23b00 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
23b10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
23b20 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
23b30 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
23b40 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
23b50 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
23b60 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
23b70 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
23b80 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
23b90 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
23ba0 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
23bb0 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
23bc0 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
23bd0 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
23be0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
23bf0 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
23c00 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
23c10 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
23c20 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
23c30 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
23c40 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
23c50 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
23c60 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
23c70 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
23c80 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
23c90 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
23ca0 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
23cb0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
23cc0 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
23cd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
23ce0 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
23cf0 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
23d00 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
23d10 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
23d20 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
23d30 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c  0, then a (feebl
23d40 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  e) effort is mad
23d50 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
23d60 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
23d70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23d80 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
23d90 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
23da0 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
23db0 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
23dc0 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
23dd0 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
23de0 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
23df0 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
23e00 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
23e10 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
23e20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61  *.** If the "exa
23e30 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  ct" parameter is
23e40 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20   not 0, and the 
23e50 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72  page-number near
23e60 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e  by exists .** an
23e70 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
23e80 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
23e90 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
23ea0 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54  o be returned. T
23eb0 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75  his.** is only u
23ec0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
23ed0 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65  um databases whe
23ee0 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  n allocating a n
23ef0 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ew table..*/.sta
23f00 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
23f10 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
23f20 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d  hared *pBt, .  M
23f30 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
23f40 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c   .  Pgno *pPgno,
23f50 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c   .  Pgno nearby,
23f60 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20  .  u8 exact.){. 
23f70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
23f80 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33  ;.  int rc;.  u3
23f90 32 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 n;     /* Numb
23fa0 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
23fb0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
23fc0 20 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   u32 k;     /* N
23fd0 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
23fe0 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
23ff0 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
24000 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
24010 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
24020 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
24030 3b 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b  ;.  Pgno mxPage;
24040 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69       /* Total si
24050 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
24060 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73  se file */..  as
24070 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
24080 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
24090 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31  tex) );.  pPage1
240a0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
240b0 20 20 6d 78 50 61 67 65 20 3d 20 70 61 67 65 72    mxPage = pager
240c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
240d0 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26    n = get4byte(&
240e0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
240f0 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 6d 78 50 61  ]);.  if( n>mxPa
24100 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
24110 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24120 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
24130 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
24140 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
24150 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
24160 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
24170 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
24180 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
24190 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
241a0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
241b0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
241c0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
241d0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
241e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
241f0 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
24200 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
24210 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
24220 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
24230 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
24240 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
24250 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
24260 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
24270 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
24280 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
24290 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
242a0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
242b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
242c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
242d0 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
242e0 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20  rby<=mxPage ){. 
242f0 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
24300 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65 61       assert( nea
24310 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20 61  rby>0 );.      a
24320 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
24330 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20  Vacuum );.      
24340 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
24350 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
24360 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  pe, 0);.      if
24370 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
24380 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
24390 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e==PTRMAP_FREEPA
243a0 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  GE ){.        se
243b0 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
243c0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50 67      }.      *pPg
243d0 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20  no = nearby;.   
243e0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
243f0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
24400 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
24410 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
24420 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
24430 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
24440 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
24450 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
24460 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
24470 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
24480 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
24490 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
244a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
244b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
244c0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
244d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
244e0 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
244f0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
24500 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
24510 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
24520 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
24530 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
24540 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
24550 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
24560 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
24570 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
24580 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
24590 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
245a0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
245b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ..    */.    do 
245c0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
245d0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
245e0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
245f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 72  k ){.        iTr
24600 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
24610 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
24620 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  a[0]);.      }el
24630 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75  se{.        iTru
24640 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
24650 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
24660 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
24670 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
24680 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ge ){.        rc
24690 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
246a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65  T_BKPT;.      }e
246b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
246c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
246d0 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
246e0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
246f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24700 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
24710 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
24720 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
24730 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
24740 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67    }..      k = g
24750 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
24760 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
24770 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
24780 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
24790 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
247a0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
247b0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
247c0 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
247d0 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
247e0 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
247f0 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
24800 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
24810 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
24820 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
24830 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
24840 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
24850 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
24860 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24870 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
24880 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
24890 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
248a0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
248b0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
248c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
248d0 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
248e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
248f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
24900 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
24910 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
24920 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
24930 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
24940 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
24950 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
24960 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
24970 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
24980 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
24990 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
249a0 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
249b0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
249c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
249d0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
249e0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
249f0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
24a00 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
24a10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24a20 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
24a30 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
24a40 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
24a50 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
24a60 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
24a70 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
24a80 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
24a90 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
24aa0 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
24ab0 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
24ac0 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
24ad0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
24ae0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
24af0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
24b00 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
24b10 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
24b20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
24b30 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
24b40 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
24b50 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
24b60 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
24b70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
24b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24b90 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
24ba0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
24bb0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
24bc0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
24bd0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
24be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
24bf0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
24c00 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
24c10 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
24c20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
24c30 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
24c40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
24c50 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
24c60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
24c70 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
24c80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
24c90 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
24ca0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
24cb0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
24cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
24cd0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
24ce0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
24cf0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
24d00 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
24d10 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
24d20 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
24d30 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
24d40 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
24d50 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
24d60 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
24d70 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
24d80 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
24d90 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
24da0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
24db0 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
24dc0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
24dd0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
24de0 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78  if( iNewTrunk>mx
24df0 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20 20  Page ){ .       
24e00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
24e10 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24e20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
24e30 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24e40 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
24e50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
24e60 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
24e70 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b  e(pBt, iNewTrunk
24e80 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29  , &pNewTrunk, 0)
24e90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
24ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
24ec0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
24ed0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
24ee0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
24ef0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24f00 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62  e(pNewTrunk->pDb
24f10 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24f20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
24f30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
24f40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
24f50 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20  ewTrunk);.      
24f60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
24f70 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
24f80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24f90 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
24fa0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
24fb0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
24fc0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
24fd0 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65 77    put4byte(&pNew
24fe0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
24ff0 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
25000 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
25010 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70  nk->aData[8], &p
25020 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d  Trunk->aData[12]
25030 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20  , (k-1)*4);.    
25040 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
25050 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
25060 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72          if( !pPr
25070 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
25080 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73         assert( s
25090 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
250a0 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e 70  teable(pPage1->p
250b0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
250c0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
250d0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
250e0 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  2], iNewTrunk);.
250f0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
25100 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25110 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
25120 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e  ite(pPrevTrunk->
25130 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
25140 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
25150 20 20 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 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25190 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76 54  put4byte(&pPrevT
251a0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
251b0 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  iNewTrunk);.    
251c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
251d0 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b  }.        pTrunk
251e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52   = 0;.        TR
251f0 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
25200 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72  %d trunk - %d fr
25210 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22  ee pages left\n"
25220 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b  , *pPgno, n-1));
25230 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
25240 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20  lse if( k>0 ){. 
25250 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63         /* Extrac
25260 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68  t a leaf from th
25270 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20  e trunk */.     
25280 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a     u32 closest;.
25290 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61          Pgno iPa
252a0 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69  ge;.        unsi
252b0 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61  gned char *aData
252c0 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61   = pTrunk->aData
252d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
252e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
252f0 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
25300 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
25310 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
25320 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
25330 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
25340 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61  .        if( nea
25350 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  rby>0 ){.       
25360 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20     u32 i;.      
25370 20 20 20 20 69 6e 74 20 64 69 73 74 3b 0a 20 20      int dist;.  
25380 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
25390 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
253a0 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
253b0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
253c0 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  by;.          if
253d0 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20  ( dist<0 ) dist 
253e0 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20  = -dist;.       
253f0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b     for(i=1; i<k;
25400 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
25410 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34     int d2 = get4
25420 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
25430 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  4]) - nearby;.  
25440 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
25450 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20  <0 ) d2 = -d2;. 
25460 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
25470 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
25480 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
25490 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
254a0 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20     dist = d2;.  
254b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
254c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
254d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
254e0 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
254f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
25500 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
25510 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  e(&aData[8+close
25520 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  st*4]);.        
25530 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65  if( iPage>mxPage
25540 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
25550 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
25560 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
25570 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
25580 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
25590 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
255a0 21 73 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69  !searchList || i
255b0 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a  Page==nearby ){.
255c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
255d0 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
255e0 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20     Pgno nPage;. 
255f0 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20           *pPgno 
25600 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20  = iPage;.       
25610 20 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72     nPage = pager
25620 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
25630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
25640 61 67 65 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  age>nPage ){.   
25650 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
25660 20 70 61 67 65 20 6f 66 66 20 74 68 65 20 65 6e   page off the en
25670 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
25680 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
25690 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
256a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
256b0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
256c0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
256d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
256e0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
256f0 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25  E: %d was leaf %
25700 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b  d of %d on trunk
25710 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20   %d".           
25720 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65        ": %d more
25730 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a   free pages\n",.
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25750 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74   *pPgno, closest
25760 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70  +1, k, pTrunk->p
25770 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
25780 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73        if( closes
25790 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  t<k-1 ){.       
257a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61       memcpy(&aDa
257b0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c  ta[8+closest*4],
257c0 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20   &aData[4+k*4], 
257d0 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
257e0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
257f0 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  te(&aData[4], k-
25800 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  1);.          as
25810 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
25820 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
25830 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 20 29  runk->pDbPage) )
25840 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f  ;.          noCo
25850 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65  ntent = !btreeGe
25860 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
25870 20 2a 70 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20   *pPgno);.      
25880 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25890 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
258a0 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
258b0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
258c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
258d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
258e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
258f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
25900 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
25910 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
25920 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25930 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
25940 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
25950 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
25960 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25970 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
25980 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
25990 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
259a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
259b0 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
259c0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
259d0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
259e0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
259f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
25a00 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
25a10 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
25a20 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
25a30 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
25a40 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
25a50 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
25a60 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
25a70 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20  gecount(pBt);.  
25a80 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65    *pPgno = nPage
25a90 20 2b 20 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a   + 1;..    if( *
25aa0 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
25ab0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
25ac0 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b  .      (*pPgno)+
25ad0 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  +;.    }..#ifnde
25ae0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
25af0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
25b00 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
25b10 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47   && PTRMAP_ISPAG
25b20 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29  E(pBt, *pPgno) )
25b30 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70  {.      /* If *p
25b40 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61  Pgno refers to a
25b50 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
25b60 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20  e, allocate two 
25b70 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20  new pages.      
25b80 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
25b90 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61   the file instea
25ba0 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69  d of one. The fi
25bb0 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61  rst allocated pa
25bc0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f  ge.      ** beco
25bd0 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65  mes a new pointe
25be0 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20  r-map page, the 
25bf0 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62  second is used b
25c00 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20  y the caller..  
25c10 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d      */.      Mem
25c20 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20  Page *pPg = 0;. 
25c30 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
25c40 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
25c50 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e  nd of file (poin
25c60 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22  ter-map page)\n"
25c70 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20  , *pPgno));.    
25c80 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
25c90 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
25ca0 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
25cb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
25cc0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
25cd0 2a 70 50 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29  *pPgno, &pPg, 0)
25ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
25cf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25d10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
25d20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
25d30 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25d40 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
25d50 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
25d60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 28 2a 70  rn rc;.      (*p
25d70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
25d80 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
25d90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
25da0 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
25db0 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
25dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
25dd0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
25de0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
25df0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
25e00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
25e10 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c   *pPgno, ppPage,
25e20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
25e30 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
25e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25e50 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
25e60 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
25e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25e80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
25e90 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
25ea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
25eb0 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
25ec0 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
25ed0 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a  e\n", *pPgno));.
25ee0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a    }..  assert( *
25ef0 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
25f00 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
25f10 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  ..end_allocate_p
25f20 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  age:.  releasePa
25f30 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65  ge(pTrunk);.  re
25f40 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
25f50 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  runk);.  if( rc=
25f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25f70 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
25f80 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
25f90 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
25fa0 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 65  e)>1 ){.      re
25fb0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
25fc0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
25fd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
25fe0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
25ff0 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
26000 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
26010 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
26020 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
26040 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
26050 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
26060 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
26070 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
26080 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
26090 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
260a0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
260b0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
260c0 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
260d0 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
260e0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
260f0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
26100 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
26110 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
26120 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
26130 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
26140 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
26150 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
26160 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
26170 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
26180 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
26190 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
261a0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
261b0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
261c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
261d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
261e0 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
261f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
26200 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
26210 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
26220 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
26230 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
26240 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
26250 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
26260 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
26270 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
26280 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
26290 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
262a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
262b0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
262c0 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
262d0 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
26300 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
26310 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
26320 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
26330 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
26340 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
26350 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
26360 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
26370 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
26380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
26390 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
263a0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
263b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
263c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
263e0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
263f0 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26410 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
26420 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
26430 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
26440 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
26450 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
26460 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
26470 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
26480 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
26490 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
264a0 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
264b0 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20 20   pMemPage ){.   
264c0 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61 67   pPage = pMemPag
264d0 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  e;.    sqlite3Pa
264e0 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70 44  gerRef(pPage->pD
264f0 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bPage);.  }else{
26500 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74 72  .    pPage = btr
26510 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74  eePageLookup(pBt
26520 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  , iPage);.  }.. 
26530 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
26540 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75 6e  e free page coun
26550 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20  t on pPage1 */. 
26560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26570 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
26580 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
26590 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
265a0 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20  ge_out;.  nFree 
265b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
265c0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
265d0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
265e0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
265f0 46 72 65 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66  Free+1);..#ifdef
26600 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
26610 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74 68  ELETE.  /* If th
26620 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  e SQLITE_SECURE_
26630 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74  DELETE compile-t
26640 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ime option is en
26650 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  abled, then.  **
26660 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
26670 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
26680 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
26690 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69   zeros..  */.  i
266a0 66 28 20 28 21 70 50 61 67 65 20 26 26 20 28 72  f( (!pPage && (r
266b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
266c0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
266d0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29  ge, &pPage, 0)))
266e0 0a 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20  .   ||          
266f0 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50    (rc = sqlite3P
26700 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
26710 3e 70 44 62 50 61 67 65 29 29 0a 20 20 29 7b 0a  >pDbPage)).  ){.
26720 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
26730 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d  e_out;.  }.  mem
26740 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
26750 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  , 0, pPage->pBt-
26760 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64  >pageSize);.#end
26770 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
26780 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
26790 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77  s auto-vacuum, w
267a0 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
267b0 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
267c0 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74  .  ** to indicat
267d0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
267e0 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  is free..  */.  
267f0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
26800 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72   ){.    rc = ptr
26810 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67  mapPut(pBt, iPag
26820 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41  e, PTRMAP_FREEPA
26830 47 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  GE, 0);.    if( 
26840 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61  rc ) goto freepa
26850 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  ge_out;.  }..  /
26860 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65  * Now manipulate
26870 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
26880 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73  base free-list s
26890 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20  tructure. There 
268a0 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73  are two.  ** pos
268b0 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74  sibilities. If t
268c0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
268d0 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c  currently empty,
268e0 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74   or if the first
268f0 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65  .  ** trunk page
26900 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
26910 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20  t is full, then 
26920 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62  this page will b
26930 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77  ecome a.  ** new
26940 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
26950 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
26960 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  , it will become
26970 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20   a leaf of the. 
26980 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
26990 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72  page in the curr
269a0 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  ent free-list. T
269b0 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20  his block tests 
269c0 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  if it.  ** is po
269d0 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
269e0 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20  e page as a new 
269f0 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a  free-list leaf..
26a00 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65    */.  if( nFree
26a10 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  !=0 ){.    int n
26a20 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
26a30 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
26a40 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63  number of leaf c
26a50 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61  ells on trunk pa
26a60 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e  ge */..    iTrun
26a70 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
26a80 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
26a90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
26aa0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
26ab0 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
26ac0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  unk, 0);.    if(
26ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26ae0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  {.      goto fre
26af0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
26b00 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65  ..    nLeaf = ge
26b10 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26b20 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69  aData[4]);.    i
26b30 66 28 20 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20  f( nLeaf<0 ){.  
26b40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
26b50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
26b60 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
26b70 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
26b80 20 69 66 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e   if( nLeaf<pBt->
26b90 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38  usableSize/4 - 8
26ba0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20   ){.      /* In 
26bb0 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20  this case there 
26bc0 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74  is room on the t
26bd0 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73  runk page to ins
26be0 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20  ert the page.   
26bf0 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65     ** being free
26c00 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e  d as a new leaf.
26c10 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
26c20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
26c30 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
26c40 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
26c50 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
26c60 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
26c70 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
26c80 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
26c90 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
26ca0 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
26cb0 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
26cc0 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
26cd0 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
26ce0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
26cf0 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
26d00 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
26d10 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
26d20 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
26d30 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
26d40 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
26d50 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
26d60 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
26d70 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
26d80 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
26d90 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
26da0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
26db0 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
26dc0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
26dd0 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
26de0 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73  l contain to res
26df0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
26e00 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
26e10 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
26e20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
26e30 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
26e40 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
26e50 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
26e60 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
26e70 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
26e80 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
26e90 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
26ea0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
26eb0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
26ec0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
26ed0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
26ee0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
26ef0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
26f00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26f10 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
26f20 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
26f30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26f40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26f50 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
26f60 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
26f70 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
26f80 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
26f90 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
26fa0 5d 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ], iPage);.#ifnd
26fb0 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
26fc0 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20  _DELETE.        
26fd0 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20  if( pPage ){.   
26fe0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26ff0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
27000 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
27010 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
27020 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
27030 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eSetHasContent(p
27040 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  Bt, iPage);.    
27050 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28    }.      TRACE(
27060 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
27070 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61  leaf on trunk pa
27080 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e  ge %d\n",pPage->
27090 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e  pgno,pTrunk->pgn
270a0 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  o));.      goto 
270b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
270c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
270d0 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74   control flows t
270e0 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
270f0 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f  en it was not po
27100 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68  ssible to add th
27110 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
27120 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61  being freed as a
27130 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68   leaf page of th
27140 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  e first trunk in
27150 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
27160 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65    ** Possibly be
27170 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c  cause the free-l
27180 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72  ist is empty, or
27190 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73   possibly becaus
271a0 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73  e the .  ** firs
271b0 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
271c0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
271d0 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68  . Either way, th
271e0 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
271f0 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63  ed.  ** will bec
27200 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73  ome the new firs
27210 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
27220 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
27230 20 2a 2f 0a 20 20 69 66 28 20 20 20 28 28 21 70   */.  if(   ((!p
27240 50 61 67 65 29 20 26 26 20 28 30 20 21 3d 20 28  Page) && (0 != (
27250 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
27260 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
27270 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
27280 29 29 0a 20 20 20 20 20 7c 7c 20 28 30 20 21 3d  )).     || (0 !=
27290 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61   (rc = sqlite3Pa
272a0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
272b0 70 44 62 50 61 67 65 29 29 29 0a 20 20 29 7b 0a  pDbPage))).  ){.
272c0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
272d0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74  e_out;.  }.  put
272e0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
272f0 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70  ta, iTrunk);.  p
27300 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
27310 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20  aData[4], 0);.  
27320 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
27330 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61  ->aData[32], iPa
27340 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46  ge);.  TRACE(("F
27350 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77  REE-PAGE: %d new
27360 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c   trunk page repl
27370 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61  acing %d\n", pPa
27380 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b  ge->pgno, iTrunk
27390 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75  ));..freepage_ou
273a0 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  t:.  if( pPage )
273b0 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  {.    pPage->isI
273c0 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nit = 0;.  }.  r
273d0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
273e0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
273f0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75  (pTrunk);.  retu
27400 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20  rn rc;.}.static 
27410 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
27420 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
27430 72 65 74 75 72 6e 20 66 72 65 65 50 61 67 65 32  return freePage2
27440 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 50 61  (pPage->pBt, pPa
27450 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  ge, pPage->pgno)
27460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
27470 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
27480 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
27490 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
274a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
274b0 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61   clearCell(MemPa
274c0 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69 67  ge *pPage, unsig
274d0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 29  ned char *pCell)
274e0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
274f0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
27500 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
27510 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f  .  Pgno ovflPgno
27520 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
27530 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f  t nOvfl;.  u16 o
27540 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20  vflPageSize;..  
27550 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
27560 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
27570 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
27580 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
27590 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
275a0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
275b0 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76  ;.  if( info.iOv
275c0 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20  erflow==0 ){.   
275d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
275e0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
275f0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
27600 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
27610 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
27620 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
27630 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
27640 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
27650 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
27660 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20  bleSize > 4 );. 
27670 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
27680 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
27690 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
276a0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
276b0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
276c0 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
276d0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
276e0 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
276f0 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
27700 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
27710 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69  -- ){.    Pgno i
27720 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65  Next = 0;.    Me
27730 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
27740 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67  ;.    if( ovflPg
27750 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f  no<2 || ovflPgno
27760 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  >pagerPagecount(
27770 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
27780 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61   0 is not a lega
27790 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  l page number an
277a0 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20  d page 1 cannot 
277b0 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20  be an .      ** 
277c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54  overflow page. T
277d0 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c  herefore if ovfl
277e0 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74  Pgno<2 or past t
277f0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20  he end of the . 
27800 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65       ** file the
27810 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
27820 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20  e corrupt. */.  
27830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27840 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
27850 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f      }.    if( nO
27860 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  vfl ){.      rc 
27870 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
27880 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c  e(pBt, ovflPgno,
27890 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29   &pOvfl, &iNext)
278a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
278b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
278c0 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50  }.    rc = freeP
278d0 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
278e0 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
278f0 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20  if( pOvfl ){.   
27900 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
27910 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50  nref(pOvfl->pDbP
27920 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
27930 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
27940 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f  rc;.    ovflPgno
27950 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20   = iNext;.  }.  
27960 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
27970 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
27980 65 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65  e the byte seque
27990 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72  nce used to repr
279a0 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20  esent a cell on 
279b0 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e  page pPage.** an
279c0 64 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74  d write that byt
279d0 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20  e sequence into 
279e0 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c  pCell[].  Overfl
279f0 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20  ow pages are.** 
27a00 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69  allocated and fi
27a10 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73  lled in as neces
27a20 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69  sary.  The calli
27a30 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  ng procedure.** 
27a40 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
27a50 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73  or making sure s
27a60 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
27a70 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
27a80 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b  ed.** for pCell[
27a90 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  ]..**.** Note th
27aa0 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f  at pCell does no
27ab0 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64  t necessary need
27ac0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
27ad0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
27ae0 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69   area.  pCell mi
27af0 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  ght point to som
27b00 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  e temporary stor
27b10 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77  age.  The cell w
27b20 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72  ill.** be constr
27b30 75 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65  ucted in this te
27b40 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65  mporary area the
27b50 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50  n copied into pP
27b60 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61  age->aData.** la
27b70 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ter..*/.static i
27b80 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20  nt fillInCell(. 
27b90 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
27ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bb0 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  /* The page that
27bc0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65   contains the ce
27bd0 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ll */.  unsigned
27be0 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20   char *pCell,   
27bf0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65         /* Comple
27c00 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63  te text of the c
27c10 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ell */.  const v
27c20 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
27c30 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
27c40 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ey */.  const vo
27c50 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44  id *pData,int nD
27c60 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61  ata,   /* The da
27c70 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72  ta */.  int nZer
27c80 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
27c90 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
27ca0 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70  zero bytes to ap
27cb0 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f  pend to pData */
27cc0 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20  .  int *pnSize  
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20    /* Write cell 
27cf0 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  size here */.){.
27d00 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a    int nPayload;.
27d10 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63    const u8 *pSrc
27d20 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c  ;.  int nSrc, n,
27d30 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   rc;.  int space
27d40 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
27d50 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65  *pOvfl = 0;.  Me
27d60 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73  mPage *pToReleas
27d70 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65  e = 0;.  unsigne
27d80 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a  d char *pPrior;.
27d90 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27da0 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53  *pPayload;.  BtS
27db0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
27dc0 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ge->pBt;.  Pgno 
27dd0 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  pgnoOvfl = 0;.  
27de0 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43  int nHeader;.  C
27df0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
27e00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27e10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
27e20 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
27e30 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
27e40 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
27e50 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
27e60 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
27e70 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
27e80 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
27e90 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
27ea0 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
27eb0 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
27ec0 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
27ed0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
27ee0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
27ef0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
27f00 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
27f10 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
27f20 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
27f30 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46  Page) );..  /* F
27f40 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65  ill in the heade
27f50 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20  r. */.  nHeader 
27f60 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  = 0;.  if( !pPag
27f70 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e  e->leaf ){.    n
27f80 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d  Header += 4;.  }
27f90 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61  .  if( pPage->ha
27fa0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65  sData ){.    nHe
27fb0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
27fc0 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
27fd0 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b  ], nData+nZero);
27fe0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44  .  }else{.    nD
27ff0 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b  ata = nZero = 0;
28000 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b  .  }.  nHeader +
28010 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65  = putVarint(&pCe
28020 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75  ll[nHeader], *(u
28030 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71  64*)&nKey);.  sq
28040 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
28050 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
28060 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61  ell, &info);.  a
28070 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61  ssert( info.nHea
28080 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a  der==nHeader );.
28090 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
280a0 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61  Key==nKey );.  a
280b0 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74  ssert( info.nDat
280c0 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61 2b 6e  a==(u32)(nData+n
280d0 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  Zero) );.  .  /*
280e0 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
280f0 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  load */.  nPaylo
28100 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
28110 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
28120 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
28130 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
28140 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
28150 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
28160 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66 28 20  }else{ .    if( 
28170 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  nKey>0x7fffffff 
28180 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  || pKey==0 ){.  
28190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
281a0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  E_CORRUPT;.    }
281b0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d  .    nPayload +=
281c0 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
281d0 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
281e0 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
281f0 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
28200 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
28210 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
28220 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
28230 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
28240 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
28250 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
28260 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
28270 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
28280 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
28290 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
282a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
282b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
282c0 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
282d0 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
282e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
282f0 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
28300 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
28310 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
28320 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
28330 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
28340 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
28350 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
28360 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
28370 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
28380 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
28390 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
283a0 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
283b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
283c0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
283d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
283e0 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
283f0 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
28400 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28410 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
28420 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
28430 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
28440 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
28450 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
28460 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
28470 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
28480 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
28490 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
284a0 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
284b0 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
284c0 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
284d0 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
284e0 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
284f0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
28500 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
28510 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
28520 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
28530 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
28540 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
28550 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
28560 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
28570 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
28580 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
28590 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
285a0 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
285b0 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
285c0 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
285d0 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73   the uninitialis
285e0 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
285f0 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
28600 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
28610 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
28620 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
28630 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
28640 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
28650 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28660 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
28670 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
28680 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
28690 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
286a0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
286b0 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c  t(pBt, pgnoOvfl,
286c0 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d   eType, pgnoPtrm
286d0 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
286e0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
286f0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
28700 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
28710 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
28720 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
28730 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
28740 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
28750 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28760 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
28770 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
28780 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
28790 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
287a0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
287b0 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
287c0 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
287d0 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
287e0 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
287f0 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
28800 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
28810 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
28820 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
28830 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
28840 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
28850 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
28860 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
28870 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
28880 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
28890 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
288a0 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
288b0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
288c0 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
288d0 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
288e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
288f0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
28900 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
28910 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28920 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
28930 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
28940 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
28950 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
28960 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
28970 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
28980 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
28990 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
289a0 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
289b0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
289c0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
289d0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
289e0 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
289f0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
28a00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
28a10 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
28a20 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
28a30 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
28a40 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
28a50 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
28a60 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
28a70 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
28a80 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
28a90 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
28aa0 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
28ab0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
28ac0 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
28ad0 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
28ae0 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
28af0 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
28b00 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
28b10 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
28b20 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
28b30 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
28b40 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
28b50 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
28b60 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
28b70 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
28b80 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
28b90 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
28ba0 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
28bb0 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
28bc0 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
28bd0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
28be0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
28bf0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28c00 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28c10 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
28c20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
28c30 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
28c40 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
28c50 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
28c60 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
28c70 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
28c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28c90 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
28ca0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
28cb0 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
28cc0 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
28cd0 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
28ce0 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
28cf0 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
28d00 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
28d10 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
28d20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
28d30 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
28d40 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
28d50 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
28d60 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
28d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
28d80 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
28d90 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
28da0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
28db0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
28dc0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
28dd0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
28de0 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
28df0 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
28e00 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
28e10 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
28e20 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
28e30 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
28e40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
28e50 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
28e60 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
28e70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
28e80 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
28e90 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
28ea0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
28eb0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
28ec0 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c  tic int dropCell
28ed0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
28ee0 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
28ef0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
28f00 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
28f10 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
28f20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
28f30 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
28f40 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
28f50 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
28f60 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
28f70 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
28f80 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
28f90 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
28fa0 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
28fb0 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
28fc0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
28fd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
28fe0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
28ff0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
29000 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
29010 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d  );.  assert( sz=
29020 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
29030 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
29040 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
29050 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
29060 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
29070 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29080 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
29090 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
290a0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
290b0 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
290c0 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c  &data[pPage->cel
290d0 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64 78 5d  lOffset + 2*idx]
290e0 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
290f0 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20 28 70  e(ptr);.  if( (p
29100 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  c<pPage->hdrOffs
29110 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61  et+6+(pPage->lea
29120 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20  f?0:4)).     || 
29130 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42  (pc+sz>pPage->pB
29140 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 29  t->usableSize) )
29150 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29160 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
29170 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72 65  ;.  }.  rc = fre
29180 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70 63  eSpace(pPage, pc
29190 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63 21  , sz);.  if( rc!
291a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
291b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
291c0 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
291d0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
291e0 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
291f0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
29200 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
29210 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
29220 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
29230 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
29240 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
29250 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
29260 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
29270 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e  e += 2;.  return
29280 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
29290 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
292a0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
292b0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
292c0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
292d0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
292e0 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
292f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
29300 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
29310 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
29320 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
29330 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
29340 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
29350 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
29360 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
29370 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
29380 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
29390 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
293a0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
293b0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
293c0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66  * in pPage->aOvf
293d0 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20  l[] and make it 
293e0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c  point to the cel
293f0 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65  l content (eithe
29400 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72  r.** in pTemp or
29410 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43   the original pC
29420 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65  ell) and also re
29430 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20  cord its index. 
29440 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61  .** Allocating a
29450 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50   new entry in pP
29460 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70  age->aCell[] imp
29470 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50  lies that .** pP
29480 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69  age->nOverflow i
29490 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s incremented..*
294a0 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73  *.** If nSkip is
294b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
294c0 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20  do not copy the 
294d0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
294e0 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c  s of the.** cell
294f0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
29500 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d  l overwrite them
29510 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
29520 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66  tion returns. If
29530 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e  .** nSkip is non
29540 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c  -zero, then pCel
29550 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20  l may not point 
29560 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65  to an invalid me
29570 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a  mory location .*
29580 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b  * (but pCell+nSk
29590 69 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c  ip is always val
295a0 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  id)..*/.static i
295b0 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20  nt insertCell(. 
295c0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
295d0 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20     /* Page into 
295e0 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70  which we are cop
295f0 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ying */.  int i,
29600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
29610 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20  ew cell becomes 
29620 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66  the i-th cell of
29630 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75   the page */.  u
29640 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
29650 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
29660 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20  he new cell */. 
29670 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20   int sz,        
29680 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63     /* Bytes of c
29690 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20  ontent in pCell 
296a0 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20  */.  u8 *pTemp, 
296b0 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
296c0 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72  torage space for
296d0 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65   pCell, if neede
296e0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  d */.  Pgno iChi
296f0 6c 64 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e  ld       /* If n
29700 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65  on-zero, replace
29710 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 77   first 4 bytes w
29720 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20 2a  ith this value *
29730 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
29740 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
29750 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
29760 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
29770 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
29780 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29790 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
297a0 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
297b0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
297c0 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72  e of content for
297d0 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74   any cell in dat
297e0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  a[] */.  int end
297f0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
29800 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
29810 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
29820 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
29830 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
29840 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
29850 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
29860 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
29870 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
29880 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
29890 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
298a0 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70   data[] of the p
298b0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
298c0 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
298d0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
298e0 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
298f0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
29900 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
29910 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
29920 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
29930 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
29940 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
29950 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
29960 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
29970 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
29980 20 20 69 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69    int nSkip = (i
29990 43 68 69 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a  Child ? 4 : 0);.
299a0 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
299b0 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65  && i<=pPage->nCe
299c0 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  ll+pPage->nOverf
299d0 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28  low );.  assert(
299e0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d   pPage->nCell<=M
299f0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
29a00 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50  t) && MX_CELL(pP
29a10 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20  age->pBt)<=5460 
29a20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29a30 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
29a40 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
29a50 61 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  aOvfl) );.  asse
29a60 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65  rt( sz==cellSize
29a70 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
29a80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
29a90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
29aa0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
29ab0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50  tex) );.  if( pP
29ac0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c  age->nOverflow |
29ad0 7c 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46  | sz+2>pPage->nF
29ae0 72 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ree ){.    if( p
29af0 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  Temp ){.      me
29b00 6d 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70  mcpy(pTemp+nSkip
29b10 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73  , pCell+nSkip, s
29b20 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  z-nSkip);.      
29b30 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20  pCell = pTemp;. 
29b40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43 68     }.    if( iCh
29b50 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74  ild ){.      put
29b60 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 43 68  4byte(pCell, iCh
29b70 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ild);.    }.    
29b80 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
29b90 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
29ba0 72 74 28 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65  rt( j<(int)(size
29bb0 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29  of(pPage->aOvfl)
29bc0 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  /sizeof(pPage->a
29bd0 4f 76 66 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20  Ovfl[0])) );.   
29be0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
29bf0 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
29c00 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
29c10 5b 6a 5d 2e 69 64 78 20 3d 20 28 75 31 36 29 69  [j].idx = (u16)i
29c20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
29c30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
29c40 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
29c50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
29c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29c70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29c80 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
29c90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
29ca0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
29cb0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
29cc0 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
29cd0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68  ge->aData;.    h
29ce0 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
29cf0 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d  ffset;.    top =
29d00 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
29d10 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c  hdr+5]);.    cel
29d20 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
29d30 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20  >cellOffset;.   
29d40 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65   end = cellOffse
29d50 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
29d60 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20  ll + 2;.    ins 
29d70 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
29d80 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20  *i;.    if( end 
29d90 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20  > top - sz ){.  
29da0 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
29db0 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  entPage(pPage);.
29dc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
29dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
29de0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
29df0 20 20 20 20 7d 0a 20 20 20 20 20 20 74 6f 70 20      }.      top 
29e00 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
29e10 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
29e20 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a  assert( end + sz
29e30 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d   <= top );.    }
29e40 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63  .    idx = alloc
29e50 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
29e60 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sz);.    assert(
29e70 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73   idx>0 );.    as
29e80 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74  sert( end <= get
29e90 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
29ea0 35 5d 29 20 29 3b 0a 20 20 20 20 69 66 20 28 69  5]) );.    if (i
29eb0 64 78 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70  dx+sz > pPage->p
29ec0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20  Bt->usableSize) 
29ed0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
29ee0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
29ef0 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  PT;.    }.    pP
29f00 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20  age->nCell++;.  
29f10 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
29f20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20   pPage->nFree - 
29f30 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20  (u16)(2 + sz);. 
29f40 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
29f50 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
29f60 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
29f70 70 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  p);.    if( iChi
29f80 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
29f90 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
29fa0 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
29fb0 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
29fc0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
29fd0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
29fe0 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
29ff0 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
2a000 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
2a010 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
2a020 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
2a030 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
2a040 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2a050 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
2a060 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
2a070 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a080 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
2a090 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
2a0a0 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
2a0b0 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
2a0c0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
2a0d0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2a0e0 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
2a0f0 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
2a100 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
2a110 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
2a120 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
2a130 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
2a140 75 72 6e 20 70 74 72 6d 61 70 50 75 74 4f 76 66  urn ptrmapPutOvf
2a150 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
2a160 6c 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  l);.    }.#endif
2a170 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2a180 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a190 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66  ** Add a list of
2a1a0 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65   cells to a page
2a1b0 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f 75  .  The page shou
2a1c0 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20  ld be initially 
2a1d0 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65  empty..** The ce
2a1e0 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74 65  lls are guarante
2a1f0 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ed to fit on the
2a200 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
2a210 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61   void assemblePa
2a220 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
2a230 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70  Page,   /* The p
2a240 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62  age to be assemb
2a250 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lied */.  int nC
2a260 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  ell,        /* T
2a270 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c  he number of cel
2a280 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69  ls to add to thi
2a290 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  s page */.  u8 *
2a2a0 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a  *apCell,      /*
2a2b0 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c   Pointers to cel
2a2c0 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31  l bodies */.  u1
2a2d0 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20  6 *aSize        
2a2e0 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20  /* Sizes of the 
2a2f0 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
2a300 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2a310 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2a320 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
2a330 72 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73  r;     /* Addres
2a340 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70  s of next cell p
2a350 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ointer */.  int 
2a360 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a  cellbody;     /*
2a370 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
2a380 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20   cell body */.  
2a390 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
2a3a0 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a3c0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66  ointer to data f
2a3d0 6f 72 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f  or pPage */.  co
2a3e0 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
2a3f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
2a400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2a410 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f 6e  set of header on
2a420 20 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73   pPage */.  cons
2a430 74 20 69 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20  t int nUsable = 
2a440 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2a450 6c 65 53 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c  leSize; /* Usabl
2a460 65 20 73 69 7a 65 20 6f 66 20 70 61 67 65 20 2a  e size of page *
2a470 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
2a480 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2a490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2a4a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2a4b0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2a4c0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2a4d0 20 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65   nCell>=0 && nCe
2a4e0 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
2a4f0 65 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45  e->pBt) && MX_CE
2a500 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
2a510 35 34 36 30 20 29 3b 0a 20 20 61 73 73 65 72 74  5460 );.  assert
2a520 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2a530 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
2a540 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
2a550 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2a560 65 20 70 61 67 65 20 68 61 73 20 6a 75 73 74 20  e page has just 
2a570 62 65 65 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a  been zeroed by z
2a580 65 72 6f 50 61 67 65 28 29 20 2a 2f 0a 20 20 61  eroPage() */.  a
2a590 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2a5a0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2a5b0 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64 61  rt( get2byte(&da
2a5c0 74 61 5b 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61  ta[hdr+5])==nUsa
2a5d0 62 6c 65 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70  ble );..  pCellp
2a5e0 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
2a5f0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e  ->cellOffset + n
2a600 43 65 6c 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62  Cell*2];.  cellb
2a610 6f 64 79 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20  ody = nUsable;. 
2a620 20 66 6f 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20   for(i=nCell-1; 
2a630 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
2a640 70 43 65 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20  pCellptr -= 2;. 
2a650 20 20 20 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61     cellbody -= a
2a660 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74  Size[i];.    put
2a670 32 62 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20  2byte(pCellptr, 
2a680 63 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d  cellbody);.    m
2a690 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
2a6a0 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
2a6b0 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d  , aSize[i]);.  }
2a6c0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
2a6d0 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29  a[hdr+3], nCell)
2a6e0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
2a6f0 74 61 5b 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62  ta[hdr+5], cellb
2a700 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ody);.  pPage->n
2a710 46 72 65 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32  Free -= (nCell*2
2a720 20 2b 20 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c   + nUsable - cel
2a730 6c 62 6f 64 79 29 3b 0a 20 20 70 50 61 67 65 2d  lbody);.  pPage-
2a740 3e 6e 43 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43  >nCell = (u16)nC
2a750 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
2a760 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
2a770 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
2a780 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
2a790 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
2a7a0 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
2a7b0 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
2a7c0 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
2a7d0 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
2a7e0 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
2a7f0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
2a800 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
2a810 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
2a820 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
2a830 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
2a840 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2a850 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
2a860 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
2a870 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
2a880 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
2a890 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
2a8a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
2a8b0 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
2a8c0 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
2a8d0 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
2a8e0 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
2a8f0 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
2a900 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
2a910 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
2a920 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
2a930 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
2a940 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
2a950 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
2a960 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
2a970 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
2a980 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
2a990 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
2a9a0 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
2a9b0 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
2a9c0 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
2a9d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a9e0 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
2a9f0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
2aa00 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
2aa10 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
2aa20 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
2aa30 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
2aa40 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66  balance */...#if
2aa50 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2aa60 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a  _QUICKBALANCE./*
2aa70 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e  .** This version
2aa80 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61   of balance() ha
2aa90 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  ndles the common
2aaa0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68   special case wh
2aab0 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74  ere.** a new ent
2aac0 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65  ry is being inse
2aad0 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72  rted on the extr
2aae0 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66  eme right-end of
2aaf0 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e   the.** tree, in
2ab00 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68   other words, wh
2ab10 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  en the new entry
2ab20 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
2ab30 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72   largest.** entr
2ab40 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  y in the tree..*
2ab50 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
2ab60 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74  trying balance t
2ab70 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20  he 3 right-most 
2ab80 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74  leaf pages, just
2ab90 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61   add.** a new pa
2aba0 67 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  ge to the right-
2abb0 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75  hand side and pu
2abc0 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e  t the one new en
2abd0 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70  try in.** that p
2abe0 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65  age.  This leave
2abf0 73 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65  s the right side
2ac00 20 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d   of the tree som
2ac10 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e  ewhat.** unbalan
2ac20 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61  ced.  But odds a
2ac30 72 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20  re that we will 
2ac40 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77  be inserting new
2ac50 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74   entries.** at t
2ac60 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65  he end soon afte
2ac70 72 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65  rwards so the ne
2ac80 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20  arly empty page 
2ac90 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  will quickly.** 
2aca0 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65  fill up.  On ave
2acb0 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67  rage..**.** pPag
2acc0 65 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61  e is the leaf pa
2acd0 67 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ge which is the 
2ace0 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20  right-most page 
2acf0 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20  in the tree..** 
2ad00 70 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70  pParent is its p
2ad10 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75  arent.  pPage mu
2ad20 73 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65  st have a single
2ad30 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a   overflow entry.
2ad40 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f  ** which is also
2ad50 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
2ad60 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67  entry on the pag
2ad70 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70  e..**.** The pSp
2ad80 61 63 65 20 62 75 66 66 65 72 20 69 73 20 75 73  ace buffer is us
2ad90 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 74 65  ed to store a te
2ada0 6d 70 6f 72 61 72 79 20 63 6f 70 79 20 6f 66 20  mporary copy of 
2adb0 74 68 65 20 64 69 76 69 64 65 72 0a 2a 2a 20 63  the divider.** c
2adc0 65 6c 6c 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ell that will be
2add0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 70   inserted into p
2ade0 50 61 72 65 6e 74 2e 20 53 75 63 68 20 61 20 63  Parent. Such a c
2adf0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2ae00 61 20 34 0a 2a 2a 20 62 79 74 65 20 70 61 67 65  a 4.** byte page
2ae10 20 6e 75 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64   number followed
2ae20 20 62 79 20 61 20 76 61 72 69 61 62 6c 65 20 6c   by a variable l
2ae30 65 6e 67 74 68 20 69 6e 74 65 67 65 72 2e 20 49  ength integer. I
2ae40 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
2ae50 2c 20 61 74 20 6d 6f 73 74 20 31 33 20 62 79 74  , at most 13 byt
2ae60 65 73 2e 20 48 65 6e 63 65 20 74 68 65 20 70 53  es. Hence the pS
2ae70 70 61 63 65 20 62 75 66 66 65 72 20 6d 75 73 74  pace buffer must
2ae80 20 62 65 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20   be at.** least 
2ae90 31 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  13 bytes in size
2aea0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2aeb0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
2aec0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
2aed0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
2aee0 75 38 20 2a 70 53 70 61 63 65 29 7b 0a 20 20 42  u8 *pSpace){.  B
2aef0 74 53 68 61 72 65 64 20 2a 63 6f 6e 73 74 20 70  tShared *const p
2af00 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2af10 20 20 20 20 2f 2a 20 42 2d 54 72 65 65 20 44 61      /* B-Tree Da
2af20 74 61 62 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50  tabase */.  MemP
2af30 61 67 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  age *pNew;      
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
2af60 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  ted page */.  in
2af70 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af90 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2afa0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2afb0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2afc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2afd0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e  age number of pN
2afe0 65 77 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ew */..  assert(
2aff0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b000 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2b010 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2b020 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2b030 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
2b040 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
2b050 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2b060 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2b070 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ;..  if( pPage->
2b080 6e 43 65 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72  nCell<=0 ) retur
2b090 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2b0a0 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _BKPT;..  /* All
2b0b0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2b0c0 2e 20 54 68 69 73 20 70 61 67 65 20 77 69 6c 6c  . This page will
2b0d0 20 62 65 63 6f 6d 65 20 74 68 65 20 72 69 67 68   become the righ
2b0e0 74 2d 73 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20  t-sibling of .  
2b0f0 2a 2a 20 70 50 61 67 65 2e 20 4d 61 6b 65 20 74  ** pPage. Make t
2b100 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
2b110 72 69 74 61 62 6c 65 2c 20 73 6f 20 74 68 61 74  ritable, so that
2b120 20 74 68 65 20 6e 65 77 20 64 69 76 69 64 65 72   the new divider
2b130 20 63 65 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62   cell.  ** may b
2b140 65 20 69 6e 73 65 72 74 65 64 2e 20 49 66 20 62  e inserted. If b
2b150 6f 74 68 20 74 68 65 73 65 20 6f 70 65 72 61 74  oth these operat
2b160 69 6f 6e 73 20 61 72 65 20 73 75 63 63 65 73 73  ions are success
2b170 66 75 6c 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20  ful, proceed..  
2b180 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61  */.  rc = alloca
2b190 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
2b1a0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
2b1b0 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20  , 0, 0);..  if( 
2b1c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2b1d0 0a 0a 20 20 20 20 75 38 20 2a 70 4f 75 74 20 3d  ..    u8 *pOut =
2b1e0 20 26 70 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20   &pSpace[4];.   
2b1f0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61   u8 *pCell = pPa
2b200 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
2b210 6c 6c 3b 0a 20 20 20 20 75 31 36 20 73 7a 43 65  ll;.    u16 szCe
2b220 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ll = cellSizePtr
2b230 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2b240 20 20 20 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a      u8 *pStop;..
2b250 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
2b260 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2b270 62 6c 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67  ble(pNew->pDbPag
2b280 65 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e) );.    assert
2b290 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30  ( pPage->aData[0
2b2a0 5d 3d 3d 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50  ]==(PTF_INTKEY|P
2b2b0 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
2b2c0 4c 45 41 46 29 20 29 3b 0a 20 20 20 20 7a 65 72  LEAF) );.    zer
2b2d0 6f 50 61 67 65 28 70 4e 65 77 2c 20 50 54 46 5f  oPage(pNew, PTF_
2b2e0 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44  INTKEY|PTF_LEAFD
2b2f0 41 54 41 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20  ATA|PTF_LEAF);. 
2b300 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2b310 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
2b320 20 26 73 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20   &szCell);..    
2b330 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
2b340 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
2b350 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
2b360 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20  e pointer map.  
2b370 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65    ** with entrie
2b380 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61  s for the new pa
2b390 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e  ge, and any poin
2b3a0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20  ter from the .  
2b3b0 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65    ** cell on the
2b3c0 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72   page to an over
2b3d0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 65 69  flow page. If ei
2b3e0 74 68 65 72 20 6f 66 20 74 68 65 73 65 0a 20 20  ther of these.  
2b3f0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20    ** operations 
2b400 66 61 69 6c 73 2c 20 74 68 65 20 72 65 74 75 72  fails, the retur
2b410 6e 20 63 6f 64 65 20 69 73 20 73 65 74 2c 20 62  n code is set, b
2b420 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a  ut the contents.
2b430 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
2b440 72 65 6e 74 20 70 61 67 65 20 61 72 65 20 73 74  rent page are st
2b450 69 6c 6c 20 6d 61 6e 69 70 75 6c 61 74 65 64 20  ill manipulated 
2b460 62 79 20 74 68 68 20 63 6f 64 65 20 62 65 6c 6f  by thh code belo
2b470 77 2e 0a 20 20 20 20 2a 2a 20 54 68 61 74 20 69  w..    ** That i
2b480 73 20 4f 6b 2c 20 61 74 20 74 68 69 73 20 70 6f  s Ok, at this po
2b490 69 6e 74 20 74 68 65 20 70 61 72 65 6e 74 20 70  int the parent p
2b4a0 61 67 65 20 69 73 20 67 75 61 72 61 6e 74 65 65  age is guarantee
2b4b0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d  d to.    ** be m
2b4c0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2b4d0 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
2b4e0 6f 72 20 63 6f 64 65 20 77 69 6c 6c 20 63 61 75  or code will cau
2b4f0 73 65 20 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c  se a.    ** roll
2b500 62 61 63 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e  back, undoing an
2b510 79 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  y changes made t
2b520 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
2b530 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
2b540 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
2b550 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
2b560 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
2b570 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  New, PTRMAP_BTRE
2b580 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2b590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 43  );.      if( szC
2b5a0 65 6c 6c 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63  ell>pNew->minLoc
2b5b0 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  al && rc==SQLITE
2b5c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2b5d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2b5e0 6c 50 74 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c  lPtr(pNew, pCell
2b5f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2b600 0a 20 20 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  .  .    /* Creat
2b610 65 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  e a divider cell
2b620 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
2b630 70 50 61 72 65 6e 74 2e 20 54 68 65 20 64 69 76  pParent. The div
2b640 69 64 65 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a  ider cell.    **
2b650 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2b660 2d 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65  -byte page numbe
2b670 72 20 28 74 68 65 20 70 61 67 65 20 6e 75 6d 62  r (the page numb
2b680 65 72 20 6f 66 20 70 50 61 67 65 29 20 61 6e 64  er of pPage) and
2b690 0a 20 20 20 20 2a 2a 20 61 20 76 61 72 69 61 62  .    ** a variab
2b6a0 6c 65 20 6c 65 6e 67 74 68 20 6b 65 79 20 76 61  le length key va
2b6b0 6c 75 65 20 28 77 68 69 63 68 20 6d 75 73 74 20  lue (which must 
2b6c0 62 65 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  be the same valu
2b6d0 65 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  e as the.    ** 
2b6e0 6c 61 72 67 65 73 74 20 6b 65 79 20 6f 6e 20 70  largest key on p
2b6f0 50 61 67 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  Page)..    **.  
2b700 20 20 2a 2a 20 54 6f 20 66 69 6e 64 20 74 68 65    ** To find the
2b710 20 6c 61 72 67 65 73 74 20 6b 65 79 20 76 61 6c   largest key val
2b720 75 65 20 6f 6e 20 70 50 61 67 65 2c 20 66 69 72  ue on pPage, fir
2b730 73 74 20 66 69 6e 64 20 74 68 65 20 72 69 67 68  st find the righ
2b740 74 2d 6d 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63  t-most .    ** c
2b750 65 6c 6c 20 6f 6e 20 70 50 61 67 65 2e 20 54 68  ell on pPage. Th
2b760 65 20 66 69 72 73 74 20 74 77 6f 20 66 69 65 6c  e first two fiel
2b770 64 73 20 6f 66 20 74 68 69 73 20 63 65 6c 6c 20  ds of this cell 
2b780 61 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  are the .    ** 
2b790 72 65 63 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61  record-length (a
2b7a0 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68   variable length
2b7b0 20 69 6e 74 65 67 65 72 20 61 74 20 6d 6f 73 74   integer at most
2b7c0 20 33 32 2d 62 69 74 73 20 69 6e 20 73 69 7a 65   32-bits in size
2b7d0 29 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65  ).    ** and the
2b7e0 20 6b 65 79 20 76 61 6c 75 65 20 28 61 20 76 61   key value (a va
2b7f0 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2b800 74 65 67 65 72 2c 20 6d 61 79 20 68 61 76 65 20  teger, may have 
2b810 61 6e 79 20 76 61 6c 75 65 29 2e 0a 20 20 20 20  any value)..    
2b820 2a 2a 20 54 68 65 20 66 69 72 73 74 20 6f 66 20  ** The first of 
2b830 74 68 65 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c  the while(...) l
2b840 6f 6f 70 73 20 62 65 6c 6f 77 20 73 6b 69 70 73  oops below skips
2b850 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64   over the record
2b860 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66  -length.    ** f
2b870 69 65 6c 64 2e 20 54 68 65 20 73 65 63 6f 6e 64  ield. The second
2b880 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2b890 20 63 6f 70 69 65 73 20 74 68 65 20 6b 65 79 20   copies the key 
2b8a0 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 0a 20  value from the. 
2b8b0 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50     ** cell on pP
2b8c0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 53 70  age into the pSp
2b8d0 61 63 65 20 62 75 66 66 65 72 2e 0a 20 20 20 20  ace buffer..    
2b8e0 2a 2f 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  */.    pCell = f
2b8f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2b900 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
2b910 20 20 20 20 70 53 74 6f 70 20 3d 20 26 70 43 65      pStop = &pCe
2b920 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65  ll[9];.    while
2b930 28 20 28 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78  ( (*(pCell++)&0x
2b940 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53 74  80) && pCell<pSt
2b950 6f 70 20 29 3b 0a 20 20 20 20 70 53 74 6f 70 20  op );.    pStop 
2b960 3d 20 26 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20  = &pCell[9];.   
2b970 20 77 68 69 6c 65 28 20 28 28 2a 28 70 4f 75 74   while( ((*(pOut
2b980 2b 2b 29 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  ++) = *(pCell++)
2b990 29 26 30 78 38 30 29 20 26 26 20 70 43 65 6c 6c  )&0x80) && pCell
2b9a0 3c 70 53 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f  <pStop );..    /
2b9b0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
2b9c0 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
2b9d0 74 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20  to pParent. */. 
2b9e0 20 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50     insertCell(pP
2b9f0 61 72 65 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e  arent,pParent->n
2ba00 43 65 6c 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74  Cell,pSpace,(int
2ba10 29 28 70 4f 75 74 2d 70 53 70 61 63 65 29 2c 30  )(pOut-pSpace),0
2ba20 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a  ,pPage->pgno);..
2ba30 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 72      /* Set the r
2ba40 69 67 68 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  ight-child point
2ba50 65 72 20 6f 66 20 70 50 61 72 65 6e 74 20 74 6f  er of pParent to
2ba60 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
2ba70 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  w page. */.    p
2ba80 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  ut4byte(&pParent
2ba90 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
2baa0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70  >hdrOffset+8], p
2bab0 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20  gnoNew);.  .    
2bac0 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72  /* Release the r
2bad0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
2bae0 6e 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  new page. */.   
2baf0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2bb00 77 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  w);.  }..  retur
2bb10 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
2bb20 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
2bb30 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23  ICKBALANCE */..#
2bb40 69 66 20 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if 0./*.** This 
2bb50 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
2bb60 74 20 63 6f 6e 74 72 69 62 75 74 65 20 61 6e 79  t contribute any
2bb70 74 68 69 6e 67 20 74 6f 20 74 68 65 20 6f 70 65  thing to the ope
2bb80 72 61 74 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65  ration of SQLite
2bb90 2e 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  ..** it is somet
2bba0 69 6d 65 73 20 61 63 74 69 76 61 74 65 64 20 74  imes activated t
2bbb0 65 6d 70 6f 72 61 72 69 6c 79 20 77 68 69 6c 65  emporarily while
2bbc0 20 64 65 62 75 67 67 69 6e 67 20 63 6f 64 65 20   debugging code 
2bbd0 72 65 73 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20  responsible .** 
2bbe0 66 6f 72 20 73 65 74 74 69 6e 67 20 70 6f 69 6e  for setting poin
2bbf0 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e  ter-map entries.
2bc00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
2bc10 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
2bc20 4d 65 6d 50 61 67 65 20 2a 2a 61 70 50 61 67 65  MemPage **apPage
2bc30 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20  , int nPage){.  
2bc40 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
2bc50 69 3d 30 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b  i=0; i<nPage; i+
2bc60 2b 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a  +){.    Pgno n;.
2bc70 20 20 20 20 75 38 20 65 3b 0a 20 20 20 20 4d 65      u8 e;.    Me
2bc80 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 61  mPage *pPage = a
2bc90 70 50 61 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74  pPage[i];.    Bt
2bca0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
2bcb0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  age->pBt;.    as
2bcc0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2bcd0 6e 69 74 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nit );..    for(
2bce0 6a 3d 30 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43  j=0; j<pPage->nC
2bcf0 65 6c 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ell; j++){.     
2bd00 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2bd10 20 20 20 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20        u8 *z;.   
2bd20 20 20 0a 20 20 20 20 20 20 7a 20 3d 20 66 69 6e    .      z = fin
2bd30 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b  dCell(pPage, j);
2bd40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
2bd50 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
2bd60 70 50 61 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29  pPage, z, &info)
2bd70 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f  ;.      if( info
2bd80 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
2bd90 20 20 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20        Pgno ovfl 
2bda0 3d 20 67 65 74 34 62 79 74 65 28 26 7a 5b 69 6e  = get4byte(&z[in
2bdb0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
2bdc0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2bdd0 74 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c  t(pBt, ovfl, &e,
2bde0 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61 73   &n);.        as
2bdf0 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  sert( n==pPage->
2be00 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41  pgno && e==PTRMA
2be10 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20  P_OVERFLOW1 );. 
2be20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2be30 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2be40 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 63 68  .        Pgno ch
2be50 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 7a  ild = get4byte(z
2be60 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72 6d 61  );.        ptrma
2be70 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2be80 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2be90 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61    assert( n==pPa
2bea0 67 65 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50  ge->pgno && e==P
2beb0 54 52 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20  TRMAP_BTREE );. 
2bec0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2bed0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2bee0 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
2bef0 63 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  child = get4byte
2bf00 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2bf10 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2bf20 38 5d 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61  8]);.      ptrma
2bf30 70 47 65 74 28 70 42 74 2c 20 63 68 69 6c 64 2c  pGet(pBt, child,
2bf40 20 26 65 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20   &e, &n);.      
2bf50 61 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65  assert( n==pPage
2bf60 2d 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52  ->pgno && e==PTR
2bf70 4d 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20  MAP_BTREE );.   
2bf80 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2bf90 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  1;.}.#endif../*.
2bfa0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2bfb0 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 70 79   is used to copy
2bfc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2bfd0 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 64 65   the b-tree node
2bfe0 20 73 74 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70   stored .** on p
2bff0 61 67 65 20 70 46 72 6f 6d 20 74 6f 20 70 61 67  age pFrom to pag
2c000 65 20 70 54 6f 2e 20 49 66 20 70 61 67 65 20 70  e pTo. If page p
2c010 46 72 6f 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c  From was not a l
2c020 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a  eaf page, then.*
2c030 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  * the pointer-ma
2c040 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 65 61  p entries for ea
2c050 63 68 20 63 68 69 6c 64 20 70 61 67 65 20 61 72  ch child page ar
2c060 65 20 75 70 64 61 74 65 64 20 73 6f 20 74 68 61  e updated so tha
2c070 74 20 74 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20  t the.** parent 
2c080 70 61 67 65 20 73 74 6f 72 65 64 20 69 6e 20 74  page stored in t
2c090 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 69  he pointer map i
2c0a0 73 20 70 61 67 65 20 70 54 6f 2e 20 49 66 20 70  s page pTo. If p
2c0b0 46 72 6f 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a  From contained.*
2c0c0 2a 20 61 6e 79 20 63 65 6c 6c 73 20 77 69 74 68  * any cells with
2c0d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
2c0e0 6f 69 6e 74 65 72 73 2c 20 74 68 65 6e 20 74 68  ointers, then th
2c0f0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
2c100 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
2c110 6e 74 72 69 65 73 20 61 72 65 20 61 6c 73 6f 20  ntries are also 
2c120 75 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20  updated so that 
2c130 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20  the parent page 
2c140 69 73 20 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a  is page pTo..**.
2c150 2a 2a 20 49 66 20 70 46 72 6f 6d 20 69 73 20 63  ** If pFrom is c
2c160 75 72 72 65 6e 74 6c 79 20 63 61 72 72 79 69 6e  urrently carryin
2c170 67 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63  g any overflow c
2c180 65 6c 6c 73 20 28 65 6e 74 72 69 65 73 20 69 6e  ells (entries in
2c190 20 74 68 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   the.** MemPage.
2c1a0 61 4f 76 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20  aOvfl[] array), 
2c1b0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 63 6f 70  they are not cop
2c1c0 69 65 64 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a  ied to pTo. .**.
2c1d0 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  ** Before return
2c1e0 69 6e 67 2c 20 70 61 67 65 20 70 54 6f 20 69 73  ing, page pTo is
2c1f0 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20 75   reinitialized u
2c200 73 69 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65  sing sqlite3Btre
2c210 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a  eInitPage()..**.
2c220 2a 2a 20 54 68 65 20 70 65 72 66 6f 72 6d 61 6e  ** The performan
2c230 63 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ce of this funct
2c240 69 6f 6e 20 69 73 20 6e 6f 74 20 63 72 69 74 69  ion is not criti
2c250 63 61 6c 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20  cal. It is only 
2c260 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 65 20  used by .** the 
2c270 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65  balance_shallowe
2c280 72 28 29 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f  r() and balance_
2c290 64 65 65 70 65 72 28 29 20 70 72 6f 63 65 64 75  deeper() procedu
2c2a0 72 65 73 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a  res, neither of.
2c2b0 2a 2a 20 77 68 69 63 68 20 61 72 65 20 63 61 6c  ** which are cal
2c2c0 6c 65 64 20 6f 66 74 65 6e 20 75 6e 64 65 72 20  led often under 
2c2d0 6e 6f 72 6d 61 6c 20 63 69 72 63 75 6d 73 74 61  normal circumsta
2c2e0 6e 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nces..*/.static 
2c2f0 69 6e 74 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  int copyNodeCont
2c300 65 6e 74 28 4d 65 6d 50 61 67 65 20 2a 70 46 72  ent(MemPage *pFr
2c310 6f 6d 2c 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  om, MemPage *pTo
2c320 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 20  ){.  BtShared * 
2c330 63 6f 6e 73 74 20 70 42 74 20 3d 20 70 46 72 6f  const pBt = pFro
2c340 6d 2d 3e 70 42 74 3b 0a 20 20 75 38 20 2a 20 63  m->pBt;.  u8 * c
2c350 6f 6e 73 74 20 61 46 72 6f 6d 20 3d 20 70 46 72  onst aFrom = pFr
2c360 6f 6d 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20  om->aData;.  u8 
2c370 2a 20 63 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54  * const aTo = pT
2c380 6f 2d 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20  o->aData;.  int 
2c390 63 6f 6e 73 74 20 69 46 72 6f 6d 48 64 72 20 3d  const iFromHdr =
2c3a0 20 70 46 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65   pFrom->hdrOffse
2c3b0 74 3b 0a 20 20 69 6e 74 20 63 6f 6e 73 74 20 69  t;.  int const i
2c3c0 54 6f 48 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70  ToHdr = ((pTo->p
2c3d0 67 6e 6f 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20  gno==1) ? 100 : 
2c3e0 30 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  0);.  int rc = S
2c3f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2c400 69 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74  iData;..  assert
2c410 28 20 70 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20  ( pFrom->isInit 
2c420 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 72  );.  assert( pFr
2c430 6f 6d 2d 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64  om->nFree>=iToHd
2c440 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 67  r );.  assert( g
2c450 65 74 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69  et2byte(&aFrom[i
2c460 46 72 6f 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74  FromHdr+5])<=pBt
2c470 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
2c480 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 62  .  /* Copy the b
2c490 2d 74 72 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65  -tree node conte
2c4a0 6e 74 20 66 72 6f 6d 20 70 61 67 65 20 70 46 72  nt from page pFr
2c4b0 6f 6d 20 74 6f 20 70 61 67 65 20 70 54 6f 2e 20  om to page pTo. 
2c4c0 2a 2f 0a 20 20 69 44 61 74 61 20 3d 20 67 65 74  */.  iData = get
2c4d0 32 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72  2byte(&aFrom[iFr
2c4e0 6f 6d 48 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  omHdr+5]);.  mem
2c4f0 63 70 79 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c  cpy(&aTo[iData],
2c500 20 26 61 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20   &aFrom[iData], 
2c510 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
2c520 69 44 61 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79  iData);.  memcpy
2c530 28 26 61 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26  (&aTo[iToHdr], &
2c540 61 46 72 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c  aFrom[iFromHdr],
2c550 20 70 46 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73   pFrom->cellOffs
2c560 65 74 20 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43  et + 2*pFrom->nC
2c570 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e  ell);..  /* Rein
2c580 69 74 69 61 6c 69 7a 65 20 70 61 67 65 20 70 54  itialize page pT
2c590 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f  o so that the co
2c5a0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 4d 65  ntents of the Me
2c5b0 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65 0a  mPage structure.
2c5c0 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65 20 6e    ** match the n
2c5d0 65 77 20 64 61 74 61 2e 20 54 68 65 20 69 6e 69  ew data. The ini
2c5e0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70  tialization of p
2c5f0 54 6f 20 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c  To "cannot" fail
2c600 2c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 64 61  , as the.  ** da
2c610 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 70  ta copied from p
2c620 46 72 6f 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  From is known to
2c630 20 62 65 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20   be valid.  */. 
2c640 20 70 54 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30   pTo->isInit = 0
2c650 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 72 63 20  ;.  TESTONLY(rc 
2c660 3d 20 29 20 73 71 6c 69 74 65 33 42 74 72 65 65  = ) sqlite3Btree
2c670 49 6e 69 74 50 61 67 65 28 70 54 6f 29 3b 0a 20  InitPage(pTo);. 
2c680 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2c690 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20  ITE_OK );..  /* 
2c6a0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2c6b0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2c6c0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2c6d0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
2c6e0 65 73 0a 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20  es.  ** for any 
2c6f0 62 2d 74 72 65 65 20 6f 72 20 6f 76 65 72 66 6c  b-tree or overfl
2c700 6f 77 20 70 61 67 65 73 20 74 68 61 74 20 70 54  ow pages that pT
2c710 6f 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74  o now contains t
2c720 68 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20  he pointers to. 
2c730 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
2c740 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63 20  ACUUM ){.    rc 
2c750 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
2c760 73 28 70 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65  s(pTo);.  }.  re
2c770 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c780 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
2c790 65 64 69 73 74 72 69 62 75 74 65 73 20 63 65 6c  edistributes cel
2c7a0 6c 73 20 6f 6e 20 74 68 65 20 69 50 61 72 65 6e  ls on the iParen
2c7b0 74 49 64 78 27 74 68 20 63 68 69 6c 64 20 6f 66  tIdx'th child of
2c7c0 20 70 50 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72   pParent.** (her
2c7d0 65 61 66 74 65 72 20 22 74 68 65 20 70 61 67 65  eafter "the page
2c7e0 22 29 20 61 6e 64 20 75 70 20 74 6f 20 32 20 73  ") and up to 2 s
2c7f0 69 62 6c 69 6e 67 73 20 73 6f 20 74 68 61 74 20  iblings so that 
2c800 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61  all pages have a
2c810 62 6f 75 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65  bout the.** same
2c820 20 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20   amount of free 
2c830 73 70 61 63 65 2e 20 55 73 75 61 6c 6c 79 20 61  space. Usually a
2c840 20 73 69 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20   single sibling 
2c850 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20 6f  on either side o
2c860 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 61 72  f the.** page ar
2c870 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61  e used in the ba
2c880 6c 61 6e 63 69 6e 67 2c 20 74 68 6f 75 67 68 20  lancing, though 
2c890 62 6f 74 68 20 73 69 62 6c 69 6e 67 73 20 6d 69  both siblings mi
2c8a0 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
2c8b0 65 0a 2a 2a 20 73 69 64 65 20 69 66 20 74 68 65  e.** side if the
2c8c0 20 70 61 67 65 20 69 73 20 74 68 65 20 66 69 72   page is the fir
2c8d0 73 74 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64  st or last child
2c8e0 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20   of its parent. 
2c8f0 49 66 20 74 68 65 20 70 61 67 65 20 0a 2a 2a 20  If the page .** 
2c900 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
2c910 20 73 69 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74   siblings (somet
2c920 68 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f  hing which can o
2c930 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68  nly happen if th
2c940 65 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 20 72  e page.** is a r
2c950 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 63 68  oot page or a ch
2c960 69 6c 64 20 6f 66 20 61 20 72 6f 6f 74 20 70 61  ild of a root pa
2c970 67 65 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61  ge) then all ava
2c980 69 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a  ilable siblings.
2c990 2a 2a 20 70 61 72 74 69 63 69 70 61 74 65 20 69  ** participate i
2c9a0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e  n the balancing.
2c9b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65  .**.** The numbe
2c9c0 72 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 6f 66  r of siblings of
2c9d0 20 74 68 65 20 70 61 67 65 20 6d 69 67 68 74 20   the page might 
2c9e0 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
2c9f0 64 65 63 72 65 61 73 65 64 20 62 79 20 0a 2a 2a  decreased by .**
2ca00 20 6f 6e 65 20 6f 72 20 74 77 6f 20 69 6e 20 61   one or two in a
2ca10 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
2ca20 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
2ca30 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
2ca40 66 75 6c 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74  full. .**.** Not
2ca50 65 20 74 68 61 74 20 77 68 65 6e 20 74 68 69 73  e that when this
2ca60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ca70 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68 65 20  ed, some of the 
2ca80 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
2ca90 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
2caa0 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
2cab0 64 20 69 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61  d in MemPage.aDa
2cac0 74 61 5b 5d 2e 20 54 68 69 73 20 63 61 6e 20 68  ta[]. This can h
2cad0 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
2cae0 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
2caf0 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  . This routine e
2cb00 6e 73 75 72 65 73 20 74 68 61 74 20 61 6c 6c 20  nsures that all 
2cb10 63 65 6c 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a  cells allocated.
2cb20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  ** to the page a
2cb30 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20  nd its siblings 
2cb40 66 69 74 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65  fit into MemPage
2cb50 2e 61 44 61 74 61 5b 5d 20 62 65 66 6f 72 65 20  .aData[] before 
2cb60 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
2cb70 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
2cb80 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
2cb90 70 61 67 65 20 61 6e 64 20 69 74 73 20 73 69 62  page and its sib
2cba0 6c 69 6e 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79  lings, cells may
2cbb0 20 62 65 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20   be.** inserted 
2cbc0 69 6e 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  into or removed 
2cbd0 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2cbe0 70 61 67 65 20 28 70 50 61 72 65 6e 74 29 2e 20  page (pParent). 
2cbf0 44 6f 69 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20  Doing so.** may 
2cc00 63 61 75 73 65 20 74 68 65 20 70 61 72 65 6e 74  cause the parent
2cc10 20 70 61 67 65 20 74 6f 20 62 65 63 6f 6d 65 20   page to become 
2cc20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
2cc30 72 66 75 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a  rfull. If this.*
2cc40 2a 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73  * happens, it is
2cc50 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
2cc60 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
2cc70 72 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  r to invoke the 
2cc80 63 6f 72 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e  correct.** balan
2cc90 63 69 6e 67 20 72 6f 75 74 69 6e 65 20 74 6f 20  cing routine to 
2cca0 66 69 78 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  fix this problem
2ccb0 20 28 73 65 65 20 74 68 65 20 62 61 6c 61 6e 63   (see the balanc
2ccc0 65 28 29 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a  e() routine). .*
2ccd0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75  *.** If this rou
2cce0 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20 61  tine fails for a
2ccf0 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69  ny reason, it mi
2cd00 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64 61  ght leave the da
2cd10 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63  tabase.** in a c
2cd20 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e 20  orrupted state. 
2cd30 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  So if this routi
2cd40 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61  ne fails, the da
2cd50 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a  tabase should.**
2cd60 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
2cd70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 68 69 72 64  .**.** The third
2cd80 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2cd90 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66  s function, aOvf
2cda0 6c 53 70 61 63 65 2c 20 69 73 20 61 20 70 6f 69  lSpace, is a poi
2cdb0 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66  nter to a.** buf
2cdc0 66 65 72 20 70 61 67 65 2d 73 69 7a 65 20 62 79  fer page-size by
2cdd0 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 2c  tes in size. If,
2cde0 20 69 6e 20 69 6e 73 65 72 74 69 6e 67 20 63 65   in inserting ce
2cdf0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
2ce00 65 6e 74 0a 2a 2a 20 70 61 67 65 20 28 70 50 61  ent.** page (pPa
2ce10 72 65 6e 74 29 2c 20 74 68 65 20 70 61 72 65 6e  rent), the paren
2ce20 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20 6f  t page becomes o
2ce30 76 65 72 66 75 6c 6c 2c 20 74 68 69 73 20 62 75  verfull, this bu
2ce40 66 66 65 72 20 69 73 0a 2a 2a 20 75 73 65 64 20  ffer is.** used 
2ce50 74 6f 20 73 74 6f 72 65 20 74 68 65 20 70 61 72  to store the par
2ce60 65 6e 74 73 20 6f 76 65 72 66 6c 6f 77 20 63 65  ents overflow ce
2ce70 6c 6c 73 2e 20 42 65 63 61 75 73 65 20 74 68 69  lls. Because thi
2ce80 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72  s function inser
2ce90 74 73 0a 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20  ts.** a maximum 
2cea0 6f 66 20 66 6f 75 72 20 64 69 76 69 64 65 72 20  of four divider 
2ceb0 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
2cec0 61 72 65 6e 74 20 70 61 67 65 2c 20 61 6e 64 20  arent page, and 
2ced0 74 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73  the maximum.** s
2cee0 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 73 74  ize of a cell st
2cef0 6f 72 65 64 20 77 69 74 68 69 6e 20 61 6e 20 69  ored within an i
2cf00 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20  nternal node is 
2cf10 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e  always less than
2cf20 20 31 2f 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70   1/4.** of the p
2cf30 61 67 65 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f  age-size, the aO
2cf40 76 66 6c 53 70 61 63 65 5b 5d 20 62 75 66 66 65  vflSpace[] buffe
2cf50 72 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  r is guaranteed 
2cf60 74 6f 20 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65  to be large.** e
2cf70 6e 6f 75 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76  nough for all ov
2cf80 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a  erflow cells..**
2cf90 0a 2a 2a 20 49 66 20 61 4f 76 66 6c 53 70 61 63  .** If aOvflSpac
2cfa0 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 6e 75  e is set to a nu
2cfb0 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73  ll pointer, this
2cfc0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2cfd0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d  s .** SQLITE_NOM
2cfe0 45 4d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  EM..*/.static in
2cff0 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  t balance_nonroo
2d000 74 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t(.  MemPage *pP
2d010 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
2d020 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2d030 61 67 65 20 6f 66 20 73 69 62 6c 69 6e 67 73 20  age of siblings 
2d040 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a  being balanced *
2d050 2f 0a 20 20 69 6e 74 20 69 50 61 72 65 6e 74 49  /.  int iParentI
2d060 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
2d070 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2d080 22 74 68 65 20 70 61 67 65 22 20 69 6e 20 70 50  "the page" in pP
2d090 61 72 65 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61  arent */.  u8 *a
2d0a0 4f 76 66 6c 53 70 61 63 65 2c 20 20 20 20 20 20  OvflSpace,      
2d0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 61             /* pa
2d0c0 67 65 2d 73 69 7a 65 20 62 79 74 65 73 20 6f 66  ge-size bytes of
2d0d0 20 73 70 61 63 65 20 66 6f 72 20 70 61 72 65 6e   space for paren
2d0e0 74 20 6f 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20  t ovfl */.  int 
2d0f0 69 73 52 6f 6f 74 20 20 20 20 20 20 20 20 20 20  isRoot          
2d100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2d110 72 75 65 20 69 66 20 70 50 61 72 65 6e 74 20 69  rue if pParent i
2d120 73 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  s a root-page */
2d130 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
2d140 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
2d150 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20     /* The whole 
2d160 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
2d170 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20  t nCell = 0;    
2d180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2d190 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
2d1a0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69   apCell[] */.  i
2d1b0 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30  nt nMaxCells = 0
2d1c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
2d1d0 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
2d1e0 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c   apCell, szCell,
2d1f0 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74   aFrom. */.  int
2d200 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20   nNew = 0;      
2d210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d220 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2d230 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apNew[] */.  int
2d240 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20   nOld;          
2d250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2d260 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2d270 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74  apOld[] */.  int
2d280 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20   i, j, k;       
2d290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2d2a0 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
2d2b0 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20  int nxDiv;      
2d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d2d0 4e 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f  Next divider slo
2d2e0 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  t in pParent->aC
2d2f0 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ell[] */.  int r
2d300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2d310 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2d320 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2d330 75 31 36 20 6c 65 61 66 43 6f 72 72 65 63 74 69  u16 leafCorrecti
2d340 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  on;          /* 
2d350 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20  4 if pPage is a 
2d360 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20  leaf.  0 if not 
2d370 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74  */.  int leafDat
2d380 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2d390 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61    /* True if pPa
2d3a0 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20  ge is a leaf of 
2d3b0 61 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20  a LEAFDATA tree 
2d3c0 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  */.  int usableS
2d3d0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
2d3e0 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50    /* Bytes in pP
2d3f0 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68  age beyond the h
2d400 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  eader */.  int p
2d410 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20  ageFlags;       
2d420 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
2d430 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61   of pPage->aData
2d440 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62  [0] */.  int sub
2d450 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20  total;          
2d460 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61        /* Subtota
2d470 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65  l of bytes in ce
2d480 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20  lls on one page 
2d490 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31  */.  int iSpace1
2d4a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2d4b0 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
2d4c0 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
2d4d0 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76  1[] */.  int iOv
2d4e0 66 6c 53 70 61 63 65 20 3d 20 30 3b 20 20 20 20  flSpace = 0;    
2d4f0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75        /* First u
2d500 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 4f  nused byte of aO
2d510 76 66 6c 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20  vflSpace[] */.  
2d520 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20  int szScratch;  
2d530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d540 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20  Size of scratch 
2d550 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64  memory requested
2d560 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61   */.  MemPage *a
2d570 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pOld[NB];       
2d580 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20     /* pPage and 
2d590 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e  up to two siblin
2d5a0 67 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  gs */.  MemPage 
2d5b0 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20  *apCopy[NB];    
2d5c0 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65 20       /* Private 
2d5d0 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b  copies of apOld[
2d5e0 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d  ] pages */.  Mem
2d5f0 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32  Page *apNew[NB+2
2d600 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61  ];        /* pPa
2d610 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42 20  ge and up to NB 
2d620 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20 62  siblings after b
2d630 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38  alancing */.  u8
2d640 20 2a 70 52 69 67 68 74 3b 20 20 20 20 20 20 20   *pRight;       
2d650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
2d660 63 61 74 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74  cation in parent
2d670 20 6f 66 20 72 69 67 68 74 2d 73 69 62 6c 69 6e   of right-siblin
2d680 67 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  g pointer */.  u
2d690 38 20 2a 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20  8 *apDiv[NB-1]; 
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d6b0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20  ivider cells in 
2d6c0 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  pParent */.  int
2d6d0 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20   cntNew[NB+2];  
2d6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2d6f0 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66  ex in aCell[] of
2d700 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68   cell after i-th
2d710 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73   page */.  int s
2d720 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  zNew[NB+2];     
2d730 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69          /* Combi
2d740 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c  ned size of cell
2d750 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20  s place on i-th 
2d760 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
2d770 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20  pCell = 0;      
2d780 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
2d790 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
2d7a0 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
2d7b0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2d7c0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
2d7d0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2d7e0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
2d7f0 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20   u8 *aSpace1;   
2d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d810 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
2d820 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
2d830 6c 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  lls */.  Pgno pg
2d840 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
2d850 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 76 61        /* Temp va
2d860 72 20 74 6f 20 73 74 6f 72 65 20 61 20 70 61 67  r to store a pag
2d870 65 20 6e 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a  e number in */..
2d880 20 20 70 42 74 20 3d 20 70 50 61 72 65 6e 74 2d    pBt = pParent-
2d890 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
2d8a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2d8b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2d8c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2d8d0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2d8e0 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
2d8f0 50 61 67 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a  Page) );..#if 0.
2d900 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2d910 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
2d920 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
2d930 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
2d940 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23  arent->pgno));.#
2d950 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74  endif..  /* At t
2d960 68 69 73 20 70 6f 69 6e 74 20 70 50 61 72 65 6e  his point pParen
2d970 74 20 6d 61 79 20 68 61 76 65 20 61 74 20 6d 6f  t may have at mo
2d980 73 74 20 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20  st one overflow 
2d990 63 65 6c 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a  cell. And if.  *
2d9a0 2a 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  * this overflow 
2d9b0 63 65 6c 6c 20 69 73 20 70 72 65 73 65 6e 74 2c  cell is present,
2d9c0 20 69 74 20 6d 75 73 74 20 62 65 20 74 68 65 20   it must be the 
2d9d0 63 65 6c 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20  cell with .  ** 
2d9e0 69 6e 64 65 78 20 69 50 61 72 65 6e 74 49 64 78  index iParentIdx
2d9f0 2e 20 54 68 69 73 20 73 63 65 6e 61 72 69 6f 20  . This scenario 
2da00 63 6f 6d 65 73 20 61 62 6f 75 74 20 77 68 65 6e  comes about when
2da10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
2da20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 28 69   ** is called (i
2da30 6e 64 69 72 65 63 74 6c 79 29 20 66 72 6f 6d 20  ndirectly) from 
2da40 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
2da50 74 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  te(). */.  asser
2da60 74 28 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65  t( pParent->nOve
2da70 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72  rflow==0 || pPar
2da80 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2da90 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2daa0 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f  Parent->nOverflo
2dab0 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d  w==0 || pParent-
2dac0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69  >aOvfl[0].idx==i
2dad0 50 61 72 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20  ParentIdx );..  
2dae0 69 66 28 20 21 61 4f 76 66 6c 53 70 61 63 65 20  if( !aOvflSpace 
2daf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2db00 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2db10 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
2db20 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20  ibling pages to 
2db30 62 61 6c 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f  balance. Also lo
2db40 63 61 74 65 20 74 68 65 20 63 65 6c 6c 73 20 69  cate the cells i
2db50 6e 20 70 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20  n pParent .  ** 
2db60 74 68 61 74 20 64 69 76 69 64 65 20 74 68 65 20  that divide the 
2db70 73 69 62 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74  siblings. An att
2db80 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
2db90 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
2dba0 20 6f 6e 20 0a 20 20 2a 2a 20 65 69 74 68 65 72   on .  ** either
2dbb0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20   side of pPage. 
2dbc0 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
2dbd0 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
2dbe0 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
2dbf0 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 61  .  ** if there a
2dc00 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e  re fewer than NN
2dc10 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65   siblings on the
2dc20 20 6f 74 68 65 72 20 73 69 64 65 2e 20 49 66 20   other side. If 
2dc30 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
2dc40 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
2dc50 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
2dc60 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
2dc70 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a  nt are taken.  .
2dc80 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2dc90 6f 6f 70 20 61 6c 73 6f 20 64 72 6f 70 73 20 74  oop also drops t
2dca0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
2dcb0 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74   from the parent
2dcc0 20 70 61 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a   page. This.  **
2dcd0 20 77 61 79 2c 20 74 68 65 20 72 65 6d 61 69 6e   way, the remain
2dce0 64 65 72 20 6f 66 20 74 68 65 20 66 75 6e 63 74  der of the funct
2dcf0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  ion does not hav
2dd00 65 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 61  e to deal with a
2dd10 6e 79 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  ny.  ** overflow
2dd20 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 61   cells in the pa
2dd30 72 65 6e 74 20 70 61 67 65 2c 20 61 73 20 69 66  rent page, as if
2dd40 20 6f 6e 65 20 65 78 69 73 74 65 64 20 69 74 20   one existed it 
2dd50 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
2dd60 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20   been removed.  
2dd70 2a 2f 0a 20 20 69 20 3d 20 70 50 61 72 65 6e 74  */.  i = pParent
2dd80 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50  ->nOverflow + pP
2dd90 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  arent->nCell;.  
2dda0 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e  if( i<2 ){.    n
2ddb0 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f  xDiv = 0;.    nO
2ddc0 6c 64 20 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73  ld = i+1;.  }els
2ddd0 65 7b 0a 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b  e{.    nOld = 3;
2dde0 0a 20 20 20 20 69 66 28 20 69 50 61 72 65 6e 74  .    if( iParent
2ddf0 49 64 78 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  Idx==0 ){       
2de00 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
2de10 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 20 20   nxDiv = 0;.    
2de20 7d 65 6c 73 65 20 69 66 28 20 69 50 61 72 65 6e  }else if( iParen
2de30 74 49 64 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20  tIdx==i ){.     
2de40 20 6e 78 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20   nxDiv = i-2;.  
2de50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e    }else{.      n
2de60 78 44 69 76 20 3d 20 69 50 61 72 65 6e 74 49 64  xDiv = iParentId
2de70 78 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  x-1;.    }.    i
2de80 20 3d 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 2;.  }.  if( 
2de90 28 69 2b 6e 78 44 69 76 2d 70 50 61 72 65 6e 74  (i+nxDiv-pParent
2dea0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50  ->nOverflow)==pP
2deb0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2dec0 20 20 20 20 70 52 69 67 68 74 20 3d 20 26 70 50      pRight = &pP
2ded0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
2dee0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
2def0 38 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  8];.  }else{.   
2df00 20 70 52 69 67 68 74 20 3d 20 66 69 6e 64 43 65   pRight = findCe
2df10 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2df20 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2df30 65 72 66 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70  erflow);.  }.  p
2df40 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
2df50 52 69 67 68 74 29 3b 0a 20 20 77 68 69 6c 65 28  Right);.  while(
2df60 20 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 67   1 ){.    rc = g
2df70 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
2df80 74 2c 20 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b  t, pgno, &apOld[
2df90 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
2dfa0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
2dfb0 61 70 4f 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65  apOld, 0, i*size
2dfc0 6f 66 28 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20  of(MemPage*));. 
2dfd0 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
2dfe0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
2dff0 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
2e000 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
2e010 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
2e020 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28  verflow;.    if(
2e030 20 28 69 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61   (i--)==0 ) brea
2e040 6b 3b 0a 0a 20 20 20 20 69 66 28 20 70 50 61 72  k;..    if( pPar
2e050 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26  ent->nOverflow &
2e060 26 20 69 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65  & i+nxDiv==pPare
2e070 6e 74 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  nt->aOvfl[0].idx
2e080 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
2e090 69 5d 20 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f  i] = pParent->aO
2e0a0 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20  vfl[0].pCell;.  
2e0b0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
2e0c0 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
2e0d0 20 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20       szNew[i] = 
2e0e0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
2e0f0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
2e100 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e        pParent->n
2e110 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20  Overflow = 0;.  
2e120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2e130 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65  pDiv[i] = findCe
2e140 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78  ll(pParent, i+nx
2e150 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  Div-pParent->nOv
2e160 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70  erflow);.      p
2e170 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 61  gno = get4byte(a
2e180 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2e190 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53  szNew[i] = cellS
2e1a0 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
2e1b0 61 70 44 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20  apDiv[i]);..    
2e1c0 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 63 65    /* Drop the ce
2e1d0 6c 6c 20 66 72 6f 6d 20 74 68 65 20 70 61 72 65  ll from the pare
2e1e0 6e 74 20 70 61 67 65 2e 20 61 70 44 69 76 5b 69  nt page. apDiv[i
2e1f0 5d 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74  ] still points t
2e200 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  o.      ** the c
2e210 65 6c 6c 20 77 69 74 68 69 6e 20 74 68 65 20 70  ell within the p
2e220 61 72 65 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75  arent, even thou
2e230 67 68 20 69 74 20 68 61 73 20 62 65 65 6e 20 64  gh it has been d
2e240 72 6f 70 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a  ropped..      **
2e250 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62 65   This is safe be
2e260 63 61 75 73 65 20 64 72 6f 70 70 69 6e 67 20 61  cause dropping a
2e270 20 63 65 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77   cell only overw
2e280 72 69 74 65 73 20 74 68 65 20 66 69 72 73 74 0a  rites the first.
2e290 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20 62 79        ** four by
2e2a0 74 65 73 20 6f 66 20 69 74 2c 20 61 6e 64 20 74  tes of it, and t
2e2b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
2e2c0 73 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 66  s not need the f
2e2d0 69 72 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f  irst.      ** fo
2e2e0 75 72 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ur bytes of the 
2e2f0 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f  divider cell. So
2e300 20 74 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   the pointer is 
2e310 73 61 66 65 20 74 6f 20 75 73 65 0a 20 20 20 20  safe to use.    
2e320 20 20 2a 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20    ** later on.  
2e330 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
2e340 2a 2a 20 55 6e 6c 65 73 73 20 53 51 4c 69 74 65  ** Unless SQLite
2e350 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20   is compiled in 
2e360 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f  secure-delete mo
2e370 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
2e380 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  ,.      ** the d
2e390 72 6f 70 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e  ropCell() routin
2e3a0 65 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65  e will overwrite
2e3b0 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2e3c0 20 77 69 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20   with zeroes..  
2e3d0 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
2e3e0 61 73 65 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79  ase, temporarily
2e3f0 20 63 6f 70 79 20 74 68 65 20 63 65 6c 6c 20 69   copy the cell i
2e400 6e 74 6f 20 74 68 65 20 61 4f 76 66 6c 53 70 61  nto the aOvflSpa
2e410 63 65 5b 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75  ce[].      ** bu
2e420 66 66 65 72 2e 20 49 74 20 77 69 6c 6c 20 62 65  ffer. It will be
2e430 20 63 6f 70 69 65 64 20 6f 75 74 20 61 67 61 69   copied out agai
2e440 6e 20 61 73 20 73 6f 6f 6e 20 61 73 20 74 68 65  n as soon as the
2e450 20 61 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72   aSpace[] buffer
2e460 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c  .      ** is all
2e470 6f 63 61 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64  ocated.  */.#ifd
2e480 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
2e490 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 6d 65  _DELETE.      me
2e4a0 6d 63 70 79 28 26 61 4f 76 66 6c 53 70 61 63 65  mcpy(&aOvflSpace
2e4b0 5b 61 70 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e  [apDiv[i]-pParen
2e4c0 74 2d 3e 61 44 61 74 61 5d 2c 20 61 70 44 69 76  t->aData], apDiv
2e4d0 5b 69 5d 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a  [i], szNew[i]);.
2e4e0 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d        apDiv[i] =
2e4f0 20 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70 44   &aOvflSpace[apD
2e500 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61  iv[i]-pParent->a
2e510 44 61 74 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20  Data];.#endif.  
2e520 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
2e530 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50  rent, i+nxDiv-pP
2e540 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
2e550 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
2e560 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
2e570 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
2e580 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
2e590 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
2e5a0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
2e5b0 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
2e5c0 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
2e5d0 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
2e5e0 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
2e5f0 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
2e600 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
2e610 0a 20 20 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65  .  k = pBt->page
2e620 53 69 7a 65 20 2b 20 52 4f 55 4e 44 38 28 73 69  Size + ROUND8(si
2e630 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2e640 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
2e650 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
2e660 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e680 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
2e690 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
2e6a0 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e6c0 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
2e6d0 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
2e6e0 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
2e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e700 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
2e710 20 20 20 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20      + k*nOld;   
2e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 20 20 2f 2a 20 50 61 67 65 20 63 6f 70 69 65 73    /* Page copies
2e750 20 28 61 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61   (apCopy) */.  a
2e760 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
2e770 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
2e780 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
2e790 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
2e7a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2e7b0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
2e7c0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2e7d0 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
2e7e0 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
2e7f0 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63  xCells];.  aSpac
2e800 65 31 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c  e1 = (u8*)&szCel
2e810 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20  l[nMaxCells];.  
2e820 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
2e830 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70  TE_ALIGNMENT(aSp
2e840 61 63 65 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20  ace1) );..  /*. 
2e850 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72   ** Load pointer
2e860 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f  s to all cells o
2e870 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  n sibling pages 
2e880 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20  and the divider 
2e890 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20  cells.  ** into 
2e8a0 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c  the local apCell
2e8b0 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20  [] array.  Make 
2e8c0 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69  copies of the di
2e8d0 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a  vider cells.  **
2e8e0 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
2e8f0 69 6e 65 64 20 66 72 6f 6d 20 61 53 70 61 63 65  ined from aSpace
2e900 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74  1[] and remove t
2e910 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43  he the divider C
2e920 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70  ells.  ** from p
2e930 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a  Parent..  **.  *
2e940 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
2e950 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61  s are on leaf pa
2e960 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ges, then the ch
2e970 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20  ild pointers of 
2e980 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72  the.  ** divider
2e990 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70   cells are strip
2e9a0 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c  ped from the cel
2e9b0 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61  ls before they a
2e9c0 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69  re copied.  ** i
2e9d0 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20  nto aSpace1[].  
2e9e0 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c  In this way, all
2e9f0 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
2ea00 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20  [] are without. 
2ea10 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65   ** child pointe
2ea20 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73  rs.  If siblings
2ea30 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c   are not leaves,
2ea40 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69   then all cell i
2ea50 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20  n.  ** apCell[] 
2ea60 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f  include child po
2ea70 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20  inters.  Either 
2ea80 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69  way, all cells i
2ea90 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20  n apCell[].  ** 
2eaa0 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a  are alike..  **.
2eab0 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74    ** leafCorrect
2eac0 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65  ion:  4 if pPage
2ead0 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69   is a leaf.  0 i
2eae0 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61  f pPage is not a
2eaf0 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20   leaf..  **     
2eb00 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69    leafData:  1 i
2eb10 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65  f pPage holds ke
2eb20 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65  y+data and pPare
2eb30 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65  nt holds only ke
2eb40 79 73 2e 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43  ys..  */.  leafC
2eb50 6f 72 72 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c  orrection = apOl
2eb60 64 5b 30 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20  d[0]->leaf*4;.  
2eb70 6c 65 61 66 44 61 74 61 20 3d 20 61 70 4f 6c 64  leafData = apOld
2eb80 5b 30 5d 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20  [0]->hasData;.  
2eb90 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b  for(i=0; i<nOld;
2eba0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
2ebb0 69 6d 69 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f  imit;.    .    /
2ebc0 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
2ebd0 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 74 61  nything else, ta
2ebe0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
2ebf0 20 69 27 74 68 20 6f 72 69 67 69 6e 61 6c 20 73   i'th original s
2ec00 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68  ibling.    ** Th
2ec10 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66  e rest of this f
2ec20 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65  unction will use
2ec30 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63   data from the c
2ec40 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 20  opies rather.   
2ec50 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
2ec60 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
2ec70 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
2ec80 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
2ec90 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
2eca0 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72  ss of being over
2ecb0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
2ecc0 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
2ecd0 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65   apCopy[i] = (Me
2ece0 6d 50 61 67 65 2a 29 26 61 53 70 61 63 65 31 5b  mPage*)&aSpace1[
2ecf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20  pBt->pageSize + 
2ed00 6b 2a 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  k*i];.    memcpy
2ed10 28 70 4f 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c  (pOld, apOld[i],
2ed20 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
2ed30 29 3b 0a 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61  );.    pOld->aDa
2ed40 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c  ta = (void*)&pOl
2ed50 64 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  d[1];.    memcpy
2ed60 28 70 4f 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70  (pOld->aData, ap
2ed70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70  Old[i]->aData, p
2ed80 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a  Bt->pageSize);..
2ed90 20 20 20 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64      limit = pOld
2eda0 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
2edb0 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
2edc0 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
2edd0 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2ede0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
2edf0 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
2ee00 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
2ee10 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
2ee20 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
2ee30 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
2ee40 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
2ee50 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
2ee60 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
2ee70 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
2ee80 6c 64 2d 31 20 26 26 20 21 6c 65 61 66 44 61 74  ld-1 && !leafDat
2ee90 61 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a  a){.      u16 sz
2eea0 20 3d 20 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d   = (u16)szNew[i]
2eeb0 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d  ;.      u8 *pTem
2eec0 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  p;.      assert(
2eed0 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73   nCell<nMaxCells
2eee0 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c   );.      szCell
2eef0 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20  [nCell] = sz;.  
2ef00 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70      pTemp = &aSp
2ef10 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20  ace1[iSpace1];. 
2ef20 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
2ef30 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  sz;.      assert
2ef40 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53  ( sz<=pBt->pageS
2ef50 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61  ize/4 );.      a
2ef60 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d  ssert( iSpace1<=
2ef70 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
2ef80 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy(pT
2ef90 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
2efa0 7a 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c  z);.      apCell
2efb0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
2efc0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2efd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2efe0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
2eff0 7c 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  || leafCorrectio
2f000 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 73 7a  n==4 );.      sz
2f010 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2f020 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65  Cell[nCell] - le
2f030 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20  afCorrection;.  
2f040 20 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c      if( !pOld->l
2f050 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 61  eaf ){.        a
2f060 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65  ssert( leafCorre
2f070 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ction==0 );.    
2f080 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64      assert( pOld
2f090 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29  ->hdrOffset==0 )
2f0a0 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
2f0b0 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72 20 6f   right pointer o
2f0c0 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
2f0d0 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20 74 68   pOld becomes th
2f0e0 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20 20 2a  e left.        *
2f0f0 2a 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  * pointer of the
2f100 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f   divider cell */
2f110 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
2f120 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26  apCell[nCell], &
2f130 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  pOld->aData[8], 
2f140 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
2f150 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f160 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2f170 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =4 );.        if
2f180 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
2f190 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  4 ){.          /
2f1a0 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
2f1b0 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
2f1c0 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
2f1d0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  /.          szCe
2f1e0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
2f1f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f200 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a  .      nCell++;.
2f210 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
2f220 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
2f230 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
2f240 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
2f250 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
2f260 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
2f270 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
2f280 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
2f290 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
2f2a0 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
2f2b0 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2f2c0 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
2f2d0 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
2f2e0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
2f2f0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
2f300 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
2f310 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
2f320 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
2f330 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
2f340 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
2f350 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
2f360 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
2f370 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
2f380 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2f390 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
2f3a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
2f3b0 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
2f3c0 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
2f3d0 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
2f3e0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2f3f0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
2f400 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
2f410 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
2f420 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
2f430 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
2f440 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
2f450 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
2f460 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
2f470 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
2f480 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
2f490 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
2f4a0 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
2f4b0 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
2f4c0 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
2f4d0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2f4e0 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
2f4f0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
2f500 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
2f510 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2f520 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
2f530 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
2f540 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
2f550 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
2f560 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
2f570 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
2f580 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
2f590 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
2f5a0 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
2f5b0 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
2f5c0 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
2f5d0 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
2f5e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
2f5f0 0a 20 20 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b  .      if( k>NB+
2f600 31 20 29 7b 20 72 63 20 3d 20 53 51 4c 49 54 45  1 ){ rc = SQLITE
2f610 5f 43 4f 52 52 55 50 54 3b 20 67 6f 74 6f 20 62  _CORRUPT; goto b
2f620 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20  alance_cleanup; 
2f630 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a  }.    }.  }.  sz
2f640 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61  New[k] = subtota
2f650 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d  l;.  cntNew[k] =
2f660 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a   nCell;.  k++;..
2f670 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61    /*.  ** The pa
2f680 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62  cking computed b
2f690 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  y the previous b
2f6a0 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74  lock is biased t
2f6b0 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e  oward the siblin
2f6c0 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c  gs.  ** on the l
2f6d0 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c  eft side.  The l
2f6e0 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65  eft siblings are
2f6f0 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66   always nearly f
2f700 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20  ull, while the. 
2f710 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73   ** right-most s
2f720 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20  ibling might be 
2f730 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54  nearly empty.  T
2f740 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  his block of cod
2f750 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20  e attempts.  ** 
2f760 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61  to adjust the pa
2f770 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67  cking of sibling
2f780 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65  s to get a bette
2f790 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a  r balance..  **.
2f7a0 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74    ** This adjust
2f7b0 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61  ment is more tha
2f7c0 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n an optimizatio
2f7d0 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20  n.  The packing 
2f7e0 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a  above might.  **
2f7f0 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61   be so out of ba
2f800 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69  lance as to be i
2f810 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61  llegal.  For exa
2f820 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d  mple, the right-
2f830 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e  most.  ** siblin
2f840 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c  g might be compl
2f850 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  etely empty.  Th
2f860 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73  is adjustment is
2f870 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20   not optional.. 
2f880 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b   */.  for(i=k-1;
2f890 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
2f8a0 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a  int szRight = sz
2f8b0 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65  New[i];  /* Size
2f8c0 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
2f8d0 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20  he right */.    
2f8e0 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e  int szLeft = szN
2f8f0 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65  ew[i-1]; /* Size
2f900 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74   of sibling on t
2f910 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69  he left */.    i
2f920 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20  nt r;           
2f930 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
2f940 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69  ight-most cell i
2f950 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a  n left sibling *
2f960 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20  /.    int d;    
2f970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2f980 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
2f990 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20   to the left of 
2f9a0 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f  right sibling */
2f9b0 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77  ..    r = cntNew
2f9c0 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64  [i-1] - 1;.    d
2f9d0 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44   = r + 1 - leafD
2f9e0 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ata;.    assert(
2f9f0 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   d<nMaxCells );.
2fa00 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d      assert( r<nM
2fa10 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77  axCells );.    w
2fa20 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30  hile( szRight==0
2fa30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65   || szRight+szCe
2fa40 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d  ll[d]+2<=szLeft-
2fa50 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b  (szCell[r]+2) ){
2fa60 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b  .      szRight +
2fa70 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b  = szCell[d] + 2;
2fa80 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d  .      szLeft -=
2fa90 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a   szCell[r] + 2;.
2faa0 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31        cntNew[i-1
2fab0 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63  ]--;.      r = c
2fac0 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a  ntNew[i-1] - 1;.
2fad0 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20        d = r + 1 
2fae0 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20  - leafData;.    
2faf0 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d  }.    szNew[i] =
2fb00 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a   szRight;.    sz
2fb10 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66  New[i-1] = szLef
2fb20 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74  t;.  }..  /* Eit
2fb30 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65  her we found one
2fb40 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28   or more cells (
2fb50 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72  cntnew[0])>0) or
2fb60 20 70 50 61 67 65 20 69 73 0a 20 20 2a 2a 20 61   pPage is.  ** a
2fb70 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
2fb80 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72  ge.  A virtual r
2fb90 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e  oot page is when
2fba0 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20   the real root. 
2fbb0 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65   ** page is page
2fbc0 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68   1 and we are th
2fbd0 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20  e only child of 
2fbe0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  that page..  */.
2fbf0 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77    assert( cntNew
2fc00 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e  [0]>0 || (pParen
2fc10 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50  t->pgno==1 && pP
2fc20 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29  arent->nCell==0)
2fc30 20 29 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42   );..  TRACE(("B
2fc40 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20  ALANCE: old: %d 
2fc50 25 64 20 25 64 20 20 22 2c 0a 20 20 20 20 61 70  %d %d  ",.    ap
2fc60 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20  Old[0]->pgno, . 
2fc70 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f     nOld>=2 ? apO
2fc80 6c 64 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ld[1]->pgno : 0,
2fc90 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61  .    nOld>=3 ? a
2fca0 70 4f 6c 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20  pOld[2]->pgno : 
2fcb0 30 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20  0.  ));..  /*.  
2fcc0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65  ** Allocate k ne
2fcd0 77 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20  w pages.  Reuse 
2fce0 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20  old pages where 
2fcf0 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20  possible..  */. 
2fd00 20 69 66 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70   if( apOld[0]->p
2fd10 67 6e 6f 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63  gno<=1 ){.    rc
2fd20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2fd30 54 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  T;.    goto bala
2fd40 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2fd50 0a 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 61  .  pageFlags = a
2fd60 70 4f 6c 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30  pOld[0]->aData[0
2fd70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
2fd80 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  k; i++){.    Mem
2fd90 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Page *pNew;.    
2fda0 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20  if( i<nOld ){.  
2fdb0 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77      pNew = apNew
2fdc0 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a  [i] = apOld[i];.
2fdd0 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
2fde0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
2fdf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2fe00 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
2fe10 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
2fe20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
2fe30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2fe40 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
2fe50 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
2fe60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
2fe70 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2fe80 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
2fe90 6e 6f 2c 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  no, pgno, 0);.  
2fea0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2feb0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2fec0 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
2fed0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
2fee0 6e 4e 65 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  nNew++;..      /
2fef0 2a 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65  * Set the pointe
2ff00 72 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r-map entry for 
2ff10 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
2ff20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  page. */.      i
2ff30 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2ff40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2ff50 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
2ff60 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41  New->pgno, PTRMA
2ff70 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e 74  P_BTREE, pParent
2ff80 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2ff90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ffa0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2ffb0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2ffc0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
2ffd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ffe0 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
2fff0 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
30000 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
30010 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
30020 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
30030 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ld ){.    rc = f
30040 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
30050 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
30060 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
30070 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
30080 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
30090 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
300a0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
300b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
300c0 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
300d0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
300e0 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
300f0 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
30100 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
30110 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
30120 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
30130 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
30140 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
30150 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
30160 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
30170 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
30180 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
30190 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
301a0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
301b0 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
301c0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
301d0 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
301e0 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
301f0 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
30200 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
30210 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
30220 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
30230 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
30240 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
30250 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
30260 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
30270 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
30280 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
30290 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
302a0 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
302b0 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
302c0 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
302d0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
302e0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
302f0 74 20 6d 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69  t minV = apNew[i
30300 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74  ]->pgno;.    int
30310 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
30320 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
30330 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
30340 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75  pNew[j]->pgno<(u
30350 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a  nsigned)minV ){.
30360 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a          minI = j
30370 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20 3d  ;.        minV =
30380 20 61 70 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b   apNew[j]->pgno;
30390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
303a0 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b     if( minI>i ){
303b0 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20  .      int t;.  
303c0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b      MemPage *pT;
303d0 0a 20 20 20 20 20 20 74 20 3d 20 61 70 4e 65 77  .      t = apNew
303e0 5b 69 5d 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  [i]->pgno;.     
303f0 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
30400 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
30410 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20   apNew[minI];.  
30420 20 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20      apNew[minI] 
30430 3d 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pT;.    }.  }.
30440 20 20 54 52 41 43 45 28 28 22 6e 65 77 3a 20 25    TRACE(("new: %
30450 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
30460 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
30470 29 5c 6e 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b  )\n",.    apNew[
30480 30 5d 2d 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b  0]->pgno, szNew[
30490 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
304a0 3f 20 61 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f  ? apNew[1]->pgno
304b0 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20   : 0, nNew>=2 ? 
304c0 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20  szNew[1] : 0,.  
304d0 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65    nNew>=3 ? apNe
304e0 77 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20  w[2]->pgno : 0, 
304f0 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b  nNew>=3 ? szNew[
30500 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  2] : 0,.    nNew
30510 3e 3d 34 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e  >=4 ? apNew[3]->
30520 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  pgno : 0, nNew>=
30530 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
30540 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
30550 61 70 4e 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a  apNew[4]->pgno :
30560 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
30570 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
30580 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30590 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
305a0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
305b0 65 29 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65  e) );.  put4byte
305c0 28 70 52 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e  (pRight, apNew[n
305d0 4e 65 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a  New-1]->pgno);..
305e0 20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79    /*.  ** Evenly
305f0 20 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20   distribute the 
30600 64 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  data in apCell[]
30610 20 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20   across the new 
30620 70 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65  pages..  ** Inse
30630 72 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  rt divider cells
30640 20 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73   into pParent as
30650 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
30660 0a 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28  .  j = 0;.  for(
30670 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
30680 29 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62  ){.    /* Assemb
30690 6c 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69  le the new sibli
306a0 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ng page. */.    
306b0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
306c0 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73  apNew[i];.    as
306d0 73 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c  sert( j<nMaxCell
306e0 73 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67  s );.    zeroPag
306f0 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67  e(pNew, pageFlag
30700 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65  s);.    assemble
30710 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65  Page(pNew, cntNe
30720 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b  w[i]-j, &apCell[
30730 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b  j], &szCell[j]);
30740 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
30750 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e  w->nCell>0 || (n
30760 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77  New==1 && cntNew
30770 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61  [0]==0) );.    a
30780 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76  ssert( pNew->nOv
30790 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20  erflow==0 );..  
307a0 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
307b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
307c0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
307d0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
307e0 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
307f0 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
30800 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
30810 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
30820 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
30830 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
30840 74 28 20 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a  t( i<nNew-1 || j
30850 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ==nCell );.    i
30860 66 28 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20  f( j<nCell ){.  
30870 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
30880 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
30890 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20        int sz;.. 
308a0 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e       assert( j<n
308b0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
308c0 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c    pCell = apCell
308d0 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20  [j];.      sz = 
308e0 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66  szCell[j] + leaf
308f0 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
30900 20 20 70 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c    pTemp = &aOvfl
30910 53 70 61 63 65 5b 69 4f 76 66 6c 53 70 61 63 65  Space[iOvflSpace
30920 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
30930 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
30940 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
30950 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
30960 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  l, 4);.      }el
30970 73 65 20 69 66 28 20 6c 65 61 66 44 61 74 61 20  se if( leafData 
30980 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
30990 20 74 68 65 20 74 72 65 65 20 69 73 20 61 20 6c   the tree is a l
309a0 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61  eaf-data tree, a
309b0 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  nd the siblings 
309c0 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20  are leaves, .   
309d0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
309e0 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72  re is no divider
309f0 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b   cell in apCell[
30a00 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20  ]. Instead, the 
30a10 64 69 76 69 64 65 72 20 0a 20 20 20 20 20 20 20  divider .       
30a20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74   ** cell consist
30a30 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  s of the integer
30a40 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72 69 67   key for the rig
30a50 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20  ht-most cell of 
30a60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
30a70 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73  sibling-page ass
30a80 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c  embled above onl
30a90 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
30aa0 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
30ab0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d  nfo;.        j--
30ac0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30ad0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
30ae0 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b  tr(pNew, apCell[
30af0 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  j], &info);.    
30b00 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
30b10 70 3b 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20  p;.        sz = 
30b20 34 20 2b 20 70 75 74 56 61 72 69 6e 74 28 26 70  4 + putVarint(&p
30b30 43 65 6c 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b  Cell[4], info.nK
30b40 65 79 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  ey);.        pTe
30b50 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
30b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
30b70 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
30b80 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
30b90 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
30ba0 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
30bb0 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
30bc0 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
30bd0 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
30be0 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
30bf0 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
30c00 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
30c10 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
30c20 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
30c30 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
30c40 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
30c50 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
30c60 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
30c70 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
30c80 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
30c90 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
30ca0 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
30cb0 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
30cc0 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
30cd0 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
30ce0 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
30cf0 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
30d00 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
30d10 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
30d20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
30d30 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
30d40 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
30d50 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
30d60 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
30d70 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
30d80 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
30d90 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
30da0 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
30db0 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
30dc0 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
30dd0 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
30de0 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
30df0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
30e00 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
30e10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
30e20 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
30e30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
30e40 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
30e50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
30e60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
30e70 0a 20 20 20 20 20 20 69 4f 76 66 6c 53 70 61 63  .      iOvflSpac
30e80 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  e += sz;.      a
30e90 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
30ea0 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
30eb0 20 20 20 20 61 73 73 65 72 74 28 20 69 4f 76 66      assert( iOvf
30ec0 6c 53 70 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67  lSpace<=pBt->pag
30ed0 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72  eSize );.      r
30ee0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
30ef0 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70  Parent, nxDiv, p
30f00 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c  Cell, sz, pTemp,
30f10 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20   pNew->pgno);.  
30f20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30f30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c  TE_OK ) goto bal
30f40 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
30f50 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
30f60 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
30f70 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ble(pParent->pDb
30f80 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
30f90 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76  j++;.      nxDiv
30fa0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
30fb0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
30fc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
30fd0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
30fe0 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
30ff0 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
31000 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
31010 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
31020 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
31030 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
31040 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
31050 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
31060 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a  zChild, 4);.  }.
31070 0a 20 20 69 66 28 20 69 73 52 6f 6f 74 20 26 26  .  if( isRoot &&
31080 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
31090 3d 30 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 68  =0 && pParent->h
310a0 64 72 4f 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b  drOffset<=apNew[
310b0 30 5d 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20  0]->nFree ){.   
310c0 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
310d0 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  e of the b-tree 
310e0 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  now contains no 
310f0 63 65 6c 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20  cells. The only 
31100 73 69 62 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70  sibling.    ** p
31110 61 67 65 20 69 73 20 74 68 65 20 72 69 67 68 74  age is the right
31120 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
31130 72 65 6e 74 2e 20 43 6f 70 79 20 74 68 65 20 63  rent. Copy the c
31140 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
31150 20 20 20 2a 2a 20 63 68 69 6c 64 20 70 61 67 65     ** child page
31160 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
31170 2c 20 64 65 63 72 65 61 73 69 6e 67 20 74 68 65  , decreasing the
31180 20 6f 76 65 72 61 6c 6c 20 68 65 69 67 68 74 20   overall height 
31190 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d  of the.    ** b-
311a0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 62  tree structure b
311b0 79 20 6f 6e 65 2e 20 54 68 69 73 20 69 73 20 64  y one. This is d
311c0 65 73 63 72 69 62 65 64 20 61 73 20 74 68 65 20  escribed as the 
311d0 22 62 61 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77  "balance-shallow
311e0 65 72 22 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61  er".    ** sub-a
311f0 6c 67 6f 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65  lgorithm in some
31200 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a   documentation..
31210 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
31220 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
31230 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
31240 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f  , the call to co
31250 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20  pyNodeContent() 
31260 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c  .    ** sets all
31270 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
31280 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69  ries correspondi
31290 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 69  ng to database i
312a0 6d 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  mage pages .    
312b0 2a 2a 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ** for which the
312c0 20 70 6f 69 6e 74 65 72 20 69 73 20 73 74 6f 72   pointer is stor
312d0 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f  ed within the co
312e0 6e 74 65 6e 74 20 62 65 69 6e 67 20 63 6f 70 69  ntent being copi
312f0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
31300 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 73 73  * The second ass
31310 65 72 74 20 62 65 6c 6f 77 20 76 65 72 69 66 69  ert below verifi
31320 65 73 20 74 68 61 74 20 74 68 65 20 63 68 69 6c  es that the chil
31330 64 20 70 61 67 65 20 69 73 20 64 65 66 72 61 67  d page is defrag
31340 6d 65 6e 74 65 64 0a 20 20 20 20 2a 2a 20 28 69  mented.    ** (i
31350 74 20 6d 75 73 74 20 62 65 2c 20 61 73 20 69 74  t must be, as it
31360 20 77 61 73 20 6a 75 73 74 20 72 65 63 6f 6e 73   was just recons
31370 74 72 75 63 74 65 64 20 75 73 69 6e 67 20 61 73  tructed using as
31380 73 65 6d 62 6c 65 50 61 67 65 28 29 29 2e 20 54  semblePage()). T
31390 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d  his.    ** is im
313a0 70 6f 72 74 61 6e 74 20 69 66 20 74 68 65 20 70  portant if the p
313b0 61 72 65 6e 74 20 70 61 67 65 20 68 61 70 70 65  arent page happe
313c0 6e 73 20 74 6f 20 62 65 20 70 61 67 65 20 31 20  ns to be page 1 
313d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
313e0 20 20 20 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a      ** image.  *
313f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4e  /.    assert( nN
31400 65 77 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73  ew==1 );.    ass
31410 65 72 74 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e  ert( apNew[0]->n
31420 46 72 65 65 20 3d 3d 20 0a 20 20 20 20 20 20 20  Free == .       
31430 20 28 67 65 74 32 62 79 74 65 28 26 61 70 4e 65   (get2byte(&apNe
31440 77 5b 30 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d  w[0]->aData[5])-
31450 61 70 4e 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66  apNew[0]->cellOf
31460 66 73 65 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e  fset-apNew[0]->n
31470 43 65 6c 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a  Cell*2) .    );.
31480 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
31490 4b 3d 3d 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64  K==(rc = copyNod
314a0 65 43 6f 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30  eContent(apNew[0
314b0 5d 2c 20 70 50 61 72 65 6e 74 29 29 20 29 7b 0a  ], pParent)) ){.
314c0 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
314d0 61 67 65 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20  age(apNew[0]);. 
314e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
314f0 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
31500 0a 20 20 20 20 2f 2a 20 46 69 78 20 74 68 65 20  .    /* Fix the 
31510 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
31520 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 20  ies for all the 
31530 63 65 6c 6c 73 20 74 68 61 74 20 77 65 72 65 20  cells that were 
31540 73 68 69 66 74 65 64 20 61 72 6f 75 6e 64 2e 20  shifted around. 
31550 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61 72  .    ** There ar
31560 65 20 73 65 76 65 72 61 6c 20 64 69 66 66 65 72  e several differ
31570 65 6e 74 20 74 79 70 65 73 20 6f 66 20 70 6f 69  ent types of poi
31580 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
31590 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 20 20   that need to.  
315a0 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
315b0 74 68 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  th by this routi
315c0 6e 65 2e 20 53 6f 6d 65 20 6f 66 20 74 68 65 73  ne. Some of thes
315d0 65 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  e have been set 
315e0 61 6c 72 65 61 64 79 2c 20 62 75 74 0a 20 20 20  already, but.   
315f0 20 2a 2a 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f   ** many have no
31600 74 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t. The following
31610 20 69 73 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20   is a summary:. 
31620 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31     **.    **   1
31630 29 20 54 68 65 20 65 6e 74 72 69 65 73 20 61 73  ) The entries as
31640 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6e 65  sociated with ne
31650 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  w sibling pages 
31660 74 68 61 74 20 77 65 72 65 20 6e 6f 74 0a 20 20  that were not.  
31670 20 20 2a 2a 20 20 20 20 20 20 73 69 62 6c 69 6e    **      siblin
31680 67 73 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  gs when this fun
31690 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
316a0 2e 20 54 68 65 73 65 20 68 61 76 65 20 61 6c 72  . These have alr
316b0 65 61 64 79 0a 20 20 20 20 2a 2a 20 20 20 20 20  eady.    **     
316c0 20 62 65 65 6e 20 73 65 74 2e 20 57 65 20 64 6f   been set. We do
316d0 6e 27 74 20 6e 65 65 64 20 74 6f 20 77 6f 72 72  n't need to worr
316e0 79 20 61 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c  y about old sibl
316f0 69 6e 67 73 20 74 68 61 74 20 77 65 72 65 0a 20  ings that were. 
31700 20 20 20 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64     **      moved
31710 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
31720 74 20 2d 20 74 68 65 20 66 72 65 65 50 61 67 65  t - the freePage
31730 28 29 20 63 6f 64 65 20 68 61 73 20 74 61 6b 65  () code has take
31740 6e 20 63 61 72 65 0a 20 20 20 20 2a 2a 20 20 20  n care.    **   
31750 20 20 20 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20     of those..   
31760 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 32 29 20   **.    **   2) 
31770 54 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  The pointer-map 
31780 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74  entries associat
31790 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
317a0 74 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a  t overflow.    *
317b0 2a 20 20 20 20 20 20 70 61 67 65 20 69 6e 20 61  *      page in a
317c0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69  ny overflow chai
317d0 6e 73 20 75 73 65 64 20 62 79 20 6e 65 77 20 64  ns used by new d
317e0 69 76 69 64 65 72 20 63 65 6c 6c 73 2e 20 54 68  ivider cells. Th
317f0 65 73 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  ese .    **     
31800 20 68 61 76 65 20 61 6c 73 6f 20 61 6c 72 65 61   have also alrea
31810 64 79 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61  dy been taken ca
31820 72 65 20 6f 66 20 62 79 20 74 68 65 20 69 6e 73  re of by the ins
31830 65 72 74 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a  ertCell() code..
31840 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
31850 33 29 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  3) If the siblin
31860 67 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  g pages are not 
31870 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 74 68 65  leaves, then the
31880 20 63 68 69 6c 64 20 70 61 67 65 73 20 6f 66 0a   child pages of.
31890 20 20 20 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c      **      cell
318a0 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  s stored on the 
318b0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 6d 61  sibling pages ma
318c0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 75 70 64  y need to be upd
318d0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
318e0 20 2a 2a 20 20 20 34 29 20 49 66 20 74 68 65 20   **   4) If the 
318f0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 72  sibling pages ar
31900 65 20 6e 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69  e not internal i
31910 6e 74 6b 65 79 20 6e 6f 64 65 73 2c 20 74 68 65  ntkey nodes, the
31920 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20  n any.    **    
31930 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73    overflow pages
31940 20 75 73 65 64 20 62 79 20 74 68 65 73 65 20 63   used by these c
31950 65 6c 6c 73 20 6d 61 79 20 6e 65 65 64 20 74 6f  ells may need to
31960 20 62 65 20 75 70 64 61 74 65 64 0a 20 20 20 20   be updated.    
31970 2a 2a 20 20 20 20 20 20 28 69 6e 74 65 72 6e 61  **      (interna
31980 6c 20 69 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e  l intkey nodes n
31990 65 76 65 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69  ever contain poi
319a0 6e 74 65 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f  nters to overflo
319b0 77 20 70 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a  w pages)..    **
319c0 0a 20 20 20 20 2a 2a 20 20 20 35 29 20 49 66 20  .    **   5) If 
319d0 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67 65  the sibling page
319e0 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
319f0 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 69 6e 74  , then the point
31a00 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20  er-map.    **   
31a10 20 20 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74     entries for t
31a20 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  he right-child p
31a30 61 67 65 73 20 6f 66 20 65 61 63 68 20 73 69 62  ages of each sib
31a40 6c 69 6e 67 20 6d 61 79 20 6e 65 65 64 0a 20 20  ling may need.  
31a50 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 62 65 20    **      to be 
31a60 75 70 64 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a  updated..    **.
31a70 20 20 20 20 2a 2a 20 43 61 73 65 73 20 31 20 61      ** Cases 1 a
31a80 6e 64 20 32 20 61 72 65 20 64 65 61 6c 74 20 77  nd 2 are dealt w
31a90 69 74 68 20 61 62 6f 76 65 20 62 79 20 6f 74 68  ith above by oth
31aa0 65 72 20 63 6f 64 65 2e 20 54 68 65 20 6e 65 78  er code. The nex
31ab0 74 0a 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64  t.    ** block d
31ac0 65 61 6c 73 20 77 69 74 68 20 63 61 73 65 73 20  eals with cases 
31ad0 33 20 61 6e 64 20 34 20 61 6e 64 20 74 68 65 20  3 and 4 and the 
31ae0 6f 6e 65 20 61 66 74 65 72 20 74 68 61 74 2c 20  one after that, 
31af0 63 61 73 65 20 35 2e 20 53 69 6e 63 65 0a 20 20  case 5. Since.  
31b00 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 20 70    ** setting a p
31b10 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
31b20 20 69 73 20 61 20 72 65 6c 61 74 69 76 65 6c 79   is a relatively
31b30 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
31b40 74 69 6f 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a  tion, this.    *
31b50 2a 20 63 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73  * code only sets
31b60 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
31b70 72 69 65 73 20 66 6f 72 20 63 68 69 6c 64 20 6f  ries for child o
31b80 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
31b90 20 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 2a   that have.    *
31ba0 2a 20 61 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64  * actually moved
31bb0 20 62 65 74 77 65 65 6e 20 70 61 67 65 73 2e 20   between pages. 
31bc0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
31bd0 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d  *pNew = apNew[0]
31be0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
31bf0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b  Old = apCopy[0];
31c00 0a 20 20 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c  .    int nOverfl
31c10 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72  ow = pOld->nOver
31c20 66 6c 6f 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e  flow;.    int iN
31c30 65 78 74 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e  extOld = pOld->n
31c40 43 65 6c 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77  Cell + nOverflow
31c50 3b 0a 20 20 20 20 69 6e 74 20 69 4f 76 65 72 66  ;.    int iOverf
31c60 6c 6f 77 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77  low = (nOverflow
31c70 20 3f 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30   ? pOld->aOvfl[0
31c80 5d 2e 69 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20  ].idx : -1);.   
31c90 20 6a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   j = 0;         
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cb0 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 27      /* Current '
31cc0 6f 6c 64 27 20 73 69 62 6c 69 6e 67 20 70 61 67  old' sibling pag
31cd0 65 20 2a 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20  e */.    k = 0; 
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
31d00 75 72 72 65 6e 74 20 27 6e 65 77 27 20 73 69 62  urrent 'new' sib
31d10 6c 69 6e 67 20 70 61 67 65 20 2a 2f 0a 20 20 20  ling page */.   
31d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
31d30 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  l && rc==SQLITE_
31d40 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  OK; i++){.      
31d50 69 6e 74 20 69 73 44 69 76 69 64 65 72 20 3d 20  int isDivider = 
31d60 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
31d70 69 3d 3d 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20  i==iNextOld ){. 
31d80 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69         /* Cell i
31d90 20 69 73 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d   is the cell imm
31da0 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
31db0 6e 67 20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c  ng the last cell
31dc0 20 6f 6e 20 6f 6c 64 0a 20 20 20 20 20 20 20 20   on old.        
31dd0 2a 2a 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20  ** sibling page 
31de0 6a 2e 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  j. If the siblin
31df0 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 66 20  gs are not leaf 
31e00 70 61 67 65 73 20 6f 66 20 61 6e 0a 20 20 20 20  pages of an.    
31e10 20 20 20 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d      ** intkey b-
31e20 74 72 65 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20  tree, then cell 
31e30 69 20 77 61 73 20 61 20 64 69 76 69 64 65 72 20  i was a divider 
31e40 63 65 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20  cell. */.       
31e50 20 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b   pOld = apCopy[+
31e60 2b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 4e 65  +j];.        iNe
31e70 78 74 4f 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61  xtOld = i + !lea
31e80 66 44 61 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43  fData + pOld->nC
31e90 65 6c 6c 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65  ell + pOld->nOve
31ea0 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20 20 20 69  rflow;.        i
31eb0 66 28 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c  f( pOld->nOverfl
31ec0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
31ed0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64  nOverflow = pOld
31ee0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20  ->nOverflow;.   
31ef0 20 20 20 20 20 20 20 69 4f 76 65 72 66 6c 6f 77         iOverflow
31f00 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61 74 61   = i + !leafData
31f10 20 2b 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30   + pOld->aOvfl[0
31f20 5d 2e 69 64 78 3b 0a 20 20 20 20 20 20 20 20 7d  ].idx;.        }
31f30 0a 20 20 20 20 20 20 20 20 69 73 44 69 76 69 64  .        isDivid
31f40 65 72 20 3d 20 21 6c 65 61 66 44 61 74 61 3b 20  er = !leafData; 
31f50 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20   .      }..     
31f60 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f   assert(nOverflo
31f70 77 3e 30 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77  w>0 || iOverflow
31f80 3c 69 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  <i );.      asse
31f90 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c  rt(nOverflow<2 |
31fa0 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d  | pOld->aOvfl[0]
31fb0 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66  .idx==pOld->aOvf
31fc0 6c 5b 31 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20  l[1].idx-1);.   
31fd0 20 20 20 61 73 73 65 72 74 28 6e 4f 76 65 72 66     assert(nOverf
31fe0 6c 6f 77 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61  low<3 || pOld->a
31ff0 4f 76 66 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c  Ovfl[1].idx==pOl
32000 64 2d 3e 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d  d->aOvfl[2].idx-
32010 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  1);.      if( i=
32020 3d 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  =iOverflow ){.  
32030 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
32040 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
32050 20 28 2d 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30   (--nOverflow)>0
32060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f   ){.          iO
32070 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20  verflow++;.     
32080 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
32090 20 20 20 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65      if( i==cntNe
320a0 77 5b 6b 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  w[k] ){.        
320b0 2f 2a 20 43 65 6c 6c 20 69 20 69 73 20 74 68 65  /* Cell i is the
320c0 20 63 65 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c   cell immediatel
320d0 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  y following the 
320e0 6c 61 73 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77  last cell on new
320f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 69 62 6c  .        ** sibl
32100 69 6e 67 20 70 61 67 65 20 6b 2e 20 49 66 20 74  ing page k. If t
32110 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  he siblings are 
32120 6e 6f 74 20 6c 65 61 66 20 70 61 67 65 73 20 6f  not leaf pages o
32130 66 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  f an.        ** 
32140 69 6e 74 6b 65 79 20 62 2d 74 72 65 65 2c 20 74  intkey b-tree, t
32150 68 65 6e 20 63 65 6c 6c 20 69 20 69 73 20 61 20  hen cell i is a 
32160 64 69 76 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a  divider cell.  *
32170 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  /.        pNew =
32180 20 61 70 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20   apNew[++k];.   
32190 20 20 20 20 20 69 66 28 20 21 6c 65 61 66 44 61       if( !leafDa
321a0 74 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ta ) continue;. 
321b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
321c0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
321d0 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  OK );.      asse
321e0 72 74 28 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20  rt( j<nOld );.  
321f0 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e      assert( k<nN
32200 65 77 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ew );..      /* 
32210 49 66 20 74 68 65 20 63 65 6c 6c 20 77 61 73 20  If the cell was 
32220 6f 72 69 67 69 6e 61 6c 6c 79 20 64 69 76 69 64  originally divid
32230 65 72 20 63 65 6c 6c 20 28 61 6e 64 20 69 73 20  er cell (and is 
32240 6e 6f 74 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20  not now) or.    
32250 20 20 2a 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77    ** an overflow
32260 20 63 65 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65   cell, or if the
32270 20 63 65 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65   cell was locate
32280 64 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74  d on a different
32290 20 73 69 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a   sibling.      *
322a0 2a 20 70 61 67 65 20 62 65 66 6f 72 65 20 74 68  * page before th
322b0 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65  e balancing, the
322c0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  n the pointer ma
322d0 70 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63 69  p entries associ
322e0 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69  ated.      ** wi
322f0 74 68 20 61 6e 79 20 63 68 69 6c 64 20 6f 72 20  th any child or 
32300 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 6e  overflow pages n
32310 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
32320 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  d.  */.      if(
32330 20 69 73 44 69 76 69 64 65 72 20 7c 7c 20 70 4f   isDivider || pO
32340 6c 64 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ld->pgno!=pNew->
32350 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  pgno ){.        
32360 69 66 28 20 21 6c 65 61 66 43 6f 72 72 65 63 74  if( !leafCorrect
32370 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ion ){.         
32380 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
32390 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 61 70  pBt, get4byte(ap
323a0 43 65 6c 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50  Cell[i]), PTRMAP
323b0 5f 42 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67  _BTREE, pNew->pg
323c0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  no);.        }. 
323d0 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
323e0 6c 5b 69 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f  l[i]>pNew->minLo
323f0 63 61 6c 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  cal && rc==SQLIT
32400 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32410 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
32420 4f 76 66 6c 50 74 72 28 70 4e 65 77 2c 20 61 70  OvflPtr(pNew, ap
32430 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Cell[i]);.      
32440 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
32450 7d 0a 0a 20 20 20 20 69 66 28 20 21 6c 65 61 66  }..    if( !leaf
32460 43 6f 72 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20  Correction ){.  
32470 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
32480 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
32490 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nNew; i++){.    
324a0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
324b0 75 74 28 0a 09 20 20 20 20 70 42 74 2c 20 67 65  ut(..    pBt, ge
324c0 74 34 62 79 74 65 28 26 61 70 4e 65 77 5b 69 5d  t4byte(&apNew[i]
324d0 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 50 54 52  ->aData[8]), PTR
324e0 4d 41 50 5f 42 54 52 45 45 2c 20 61 70 4e 65 77  MAP_BTREE, apNew
324f0 5b 69 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  [i]->pgno);.    
32500 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30    }.    }..#if 0
32510 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 74 72 6d  .    /* The ptrm
32520 61 70 43 68 65 63 6b 50 61 67 65 73 28 29 20 63  apCheckPages() c
32530 6f 6e 74 61 69 6e 73 20 61 73 73 65 72 74 28 29  ontains assert()
32540 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74   statements that
32550 20 76 65 72 69 66 79 20 74 68 61 74 0a 20 20 20   verify that.   
32560 20 2a 2a 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20   ** all pointer 
32570 6d 61 70 20 70 61 67 65 73 20 61 72 65 20 73 65  map pages are se
32580 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 69  t correctly. Thi
32590 73 20 69 73 20 68 65 6c 70 66 75 6c 20 77 68 69  s is helpful whi
325a0 6c 65 20 0a 20 20 20 20 2a 2a 20 64 65 62 75 67  le .    ** debug
325b0 67 69 6e 67 2e 20 54 68 69 73 20 69 73 20 75 73  ging. This is us
325c0 75 61 6c 6c 79 20 64 69 73 61 62 6c 65 64 20 62  ually disabled b
325d0 65 63 61 75 73 65 20 61 20 63 6f 72 72 75 70 74  ecause a corrupt
325e0 20 64 61 74 61 62 61 73 65 20 6d 61 79 0a 20 20   database may.  
325f0 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 20 61 73    ** cause an as
32600 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
32610 20 74 6f 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20   to fail.  */.  
32620 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
32630 65 73 28 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b  es(apNew, nNew);
32640 0a 20 20 20 20 70 74 72 6d 61 70 43 68 65 63 6b  .    ptrmapCheck
32650 50 61 67 65 73 28 26 70 50 61 72 65 6e 74 2c 20  Pages(&pParent, 
32660 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  1);.#endif.  }..
32670 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
32680 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 54  t->isInit );.  T
32690 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
326a0 66 69 6e 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64  finished: old=%d
326b0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
326c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
326d0 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c  Old, nNew, nCell
326e0 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43  ));..  /*.  ** C
326f0 6c 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65  leanup before re
32700 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61  turning..  */.ba
32710 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20  lance_cleanup:. 
32720 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
32730 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66  ree(apCell);.  f
32740 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
32750 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  i++){.    releas
32760 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
32770 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
32780 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
32790 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70    releasePage(ap
327a0 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20  New[i]);.  }..  
327b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
327c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
327d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
327e0 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  n the root page 
327f0 6f 66 20 61 20 62 2d 74 72 65 65 20 73 74 72 75  of a b-tree stru
32800 63 74 75 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72  cture is.** over
32810 66 75 6c 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72  full (has one or
32820 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
32830 61 67 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ages)..**.** A n
32840 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 69 73  ew child page is
32850 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
32860 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
32870 68 65 20 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a  he current root.
32880 2a 2a 20 70 61 67 65 2c 20 69 6e 63 6c 75 64 69  ** page, includi
32890 6e 67 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ng overflow cell
328a0 73 2c 20 61 72 65 20 63 6f 70 69 65 64 20 69 6e  s, are copied in
328b0 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 54 68  to the child. Th
328c0 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69  e root.** page i
328d0 73 20 74 68 65 6e 20 6f 76 65 72 77 72 69 74 74  s then overwritt
328e0 65 6e 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e  en to make it an
328f0 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 74 68   empty page with
32900 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
32910 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69   .** pointer poi
32920 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 77  nting to the new
32930 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66   page..**.** Bef
32940 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 61  ore returning, a
32950 6c 6c 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  ll pointer-map e
32960 6e 74 72 69 65 73 20 63 6f 72 72 65 73 70 6f 6e  ntries correspon
32970 64 69 6e 67 20 74 6f 20 70 61 67 65 73 20 0a 2a  ding to pages .*
32980 2a 20 74 68 61 74 20 74 68 65 20 6e 65 77 20 63  * that the new c
32990 68 69 6c 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f  hild-page now co
329a0 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73 20  ntains pointers 
329b0 74 6f 20 61 72 65 20 75 70 64 61 74 65 64 2e 20  to are updated. 
329c0 54 68 65 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72  The.** entry cor
329d0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
329e0 65 20 6e 65 77 20 72 69 67 68 74 2d 63 68 69 6c  e new right-chil
329f0 64 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65  d pointer of the
32a00 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73   root.** page is
32a10 20 61 6c 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a   also updated..*
32a20 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
32a30 75 6c 2c 20 2a 70 70 43 68 69 6c 64 20 69 73 20  ul, *ppChild is 
32a40 73 65 74 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  set to contain a
32a50 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
32a60 65 20 63 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65  e child .** page
32a70 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69   and SQLITE_OK i
32a80 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
32a90 68 69 73 20 63 61 73 65 20 74 68 65 20 63 61 6c  his case the cal
32aa0 6c 65 72 20 69 73 20 72 65 71 75 69 72 65 64 0a  ler is required.
32ab0 2a 2a 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  ** to call relea
32ac0 73 65 50 61 67 65 28 29 20 6f 6e 20 2a 70 70 43  sePage() on *ppC
32ad0 68 69 6c 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  hild exactly onc
32ae0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
32af0 63 63 75 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72  ccurs,.** an err
32b00 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
32b10 6e 65 64 20 61 6e 64 20 2a 70 70 43 68 69 6c 64  ned and *ppChild
32b20 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f   is set to 0..*/
32b30 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
32b40 6e 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61  nce_deeper(MemPa
32b50 67 65 20 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61  ge *pRoot, MemPa
32b60 67 65 20 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20  ge **ppChild){. 
32b70 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
32b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b90 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
32ba0 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
32bb0 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
32bc0 2a 70 43 68 69 6c 64 20 3d 20 30 3b 20 20 20 20  *pChild = 0;    
32bd0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
32be0 72 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  r to a new child
32bf0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
32c00 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 20  pgnoChild;      
32c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
32c20 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
32c30 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a  new child page *
32c40 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
32c50 74 20 3d 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20  t = pRoot->pBt; 
32c60 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
32c70 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 52  */..  assert( pR
32c80 6f 6f 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  oot->nOverflow>0
32c90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
32ca0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
32cb0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
32cc0 0a 20 20 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74  .  /* Make pRoot
32cd0 2c 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  , the root page 
32ce0 6f 66 20 74 68 65 20 62 2d 74 72 65 65 2c 20 77  of the b-tree, w
32cf0 72 69 74 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74  ritable. Allocat
32d00 65 20 61 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61  e a new .  ** pa
32d10 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  ge that will bec
32d20 6f 6d 65 20 74 68 65 20 6e 65 77 20 72 69 67 68  ome the new righ
32d30 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65  t-child of pPage
32d40 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  . Copy the conte
32d50 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
32d60 6e 6f 64 65 20 73 74 6f 72 65 64 20 6f 6e 20 70  node stored on p
32d70 52 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  Root into the ne
32d80 77 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20  w child page..  
32d90 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
32da0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
32db0 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
32dc0 74 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20  t->pDbPage)).   
32dd0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
32de0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
32df0 65 50 61 67 65 28 70 42 74 2c 26 70 43 68 69 6c  ePage(pBt,&pChil
32e00 64 2c 26 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f  d,&pgnoChild,pRo
32e10 6f 74 2d 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20  ot->pgno,0)).   
32e20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
32e30 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74  c = copyNodeCont
32e40 65 6e 74 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c  ent(pRoot, pChil
32e50 64 29 29 0a 20 20 20 7c 7c 20 28 49 53 41 55 54  d)).   || (ISAUT
32e60 4f 56 41 43 55 55 4d 20 26 26 20 0a 20 20 20 20  OVACUUM && .    
32e70 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72     SQLITE_OK!=(r
32e80 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
32e90 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54  t, pgnoChild, PT
32ea0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f  RMAP_BTREE, pRoo
32eb0 74 2d 3e 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a  t->pgno))).  ){.
32ec0 20 20 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 30      *ppChild = 0
32ed0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
32ee0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  e(pChild);.    r
32ef0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
32f00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
32f10 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
32f20 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29  pChild->pDbPage)
32f30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
32f40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
32f50 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
32f60 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
32f70 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
32f80 3d 3d 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29  ==pRoot->nCell )
32f90 3b 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c  ;..  TRACE(("BAL
32fa0 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20  ANCE: copy root 
32fb0 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70  %d into %d\n", p
32fc0 52 6f 6f 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69  Root->pgno, pChi
32fd0 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f  ld->pgno));..  /
32fe0 2a 20 43 6f 70 79 20 74 68 65 20 6f 76 65 72 66  * Copy the overf
32ff0 6c 6f 77 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70  low cells from p
33000 52 6f 6f 74 20 74 6f 20 70 43 68 69 6c 64 20 2a  Root to pChild *
33010 2f 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  /.  memcpy(pChil
33020 64 2d 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d  d->aOvfl, pRoot-
33030 3e 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e  >aOvfl, pRoot->n
33040 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
33050 70 52 6f 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pRoot->aOvfl[0])
33060 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  );.  pChild->nOv
33070 65 72 66 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e  erflow = pRoot->
33080 6e 4f 76 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a  nOverflow;..  /*
33090 20 5a 65 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e   Zero the conten
330a0 74 73 20 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65  ts of pRoot. The
330b0 6e 20 69 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64  n install pChild
330c0 20 61 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   as the right-ch
330d0 69 6c 64 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61  ild. */.  zeroPa
330e0 67 65 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64  ge(pRoot, pChild
330f0 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
33100 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62  F_LEAF);.  put4b
33110 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
33120 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
33130 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
33140 29 3b 0a 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d  );..  *ppChild =
33150 20 70 43 68 69 6c 64 3b 0a 20 20 72 65 74 75 72   pChild;.  retur
33160 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
33170 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 74  /*.** The page t
33180 68 61 74 20 70 43 75 72 20 63 75 72 72 65 6e 74  hat pCur current
33190 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ly points to has
331a0 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64 69 66   just been modif
331b0 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77  ied in.** some w
331c0 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ay. This functio
331d0 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20 69 66  n figures out if
331e0 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61 74 69   this modificati
331f0 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  on means the.** 
33200 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
33210 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69   balanced, and i
33220 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65 20 61  f so calls the a
33230 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e  ppropriate balan
33240 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65  cing .** routine
33250 2e 20 42 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74  . Balancing rout
33260 69 6e 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20  ines are:.**.** 
33270 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28    balance_quick(
33280 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64  ).**   balance_d
33290 65 65 70 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c  eeper().**   bal
332a0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a  ance_nonroot().*
332b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
332c0 61 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70  ance(BtCursor *p
332d0 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Cur){.  int rc =
332e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f   SQLITE_OK;.  co
332f0 6e 73 74 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70  nst int nMin = p
33300 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  Cur->pBt->usable
33310 53 69 7a 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20  Size * 2 / 3;.  
33320 75 38 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  u8 aBalanceQuick
33330 53 70 61 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20  Space[13];.  u8 
33340 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54  *pFree = 0;..  T
33350 45 53 54 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c  ESTONLY( int bal
33360 61 6e 63 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65  ance_quick_calle
33370 64 20 3d 20 30 20 29 3b 0a 20 20 54 45 53 54 4f  d = 0 );.  TESTO
33380 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63 65  NLY( int balance
33390 5f 64 65 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d  _deeper_called =
333a0 20 30 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20   0 );..  do {.  
333b0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
333c0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d  ur->iPage;.    M
333d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
333e0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
333f0 67 65 5d 3b 0a 0a 20 20 20 20 69 66 28 20 69 50  ge];..    if( iP
33400 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
33410 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  if( pPage->nOver
33420 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
33430 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
33440 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 69   of the b-tree i
33450 73 20 6f 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74  s overfull. In t
33460 68 69 73 20 63 61 73 65 20 63 61 6c 6c 20 74 68  his case call th
33470 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c  e.        ** bal
33480 61 6e 63 65 5f 64 65 65 70 65 72 28 29 20 66 75  ance_deeper() fu
33490 6e 63 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  nction to create
334a0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 66 6f 72   a new child for
334b0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20   the root-page. 
334c0 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f         ** and co
334d0 70 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  py the current c
334e0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 72  ontents of the r
334f0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 69 74 2e 20  oot-page to it. 
33500 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  The.        ** n
33510 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
33520 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c   the do-loop wil
33530 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 63 68  l balance the ch
33540 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20 20 20  ild page..      
33550 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 61 73    */ .        as
33560 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 64  sert( (balance_d
33570 65 65 70 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d  eeper_called++)=
33580 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  =0 );.        rc
33590 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65   = balance_deepe
335a0 72 28 70 50 61 67 65 2c 20 26 70 43 75 72 2d 3e  r(pPage, &pCur->
335b0 61 70 50 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20  apPage[1]);.    
335c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
335d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
335e0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
335f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43   1;.          pC
33600 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30  ur->aiIdx[0] = 0
33610 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
33620 2d 3e 61 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a  ->aiIdx[1] = 0;.
33630 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
33640 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 31  ( pCur->apPage[1
33650 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  ]->nOverflow );.
33660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33670 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
33680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
33690 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
336a0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
336b0 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
336c0 3d 6e 4d 69 6e 20 29 7b 0a 20 20 20 20 20 20 62  =nMin ){.      b
336d0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
336e0 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
336f0 20 63 6f 6e 73 74 20 70 50 61 72 65 6e 74 20 3d   const pParent =
33700 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50   pCur->apPage[iP
33710 61 67 65 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e  age-1];.      in
33720 74 20 63 6f 6e 73 74 20 69 49 64 78 20 3d 20 70  t const iIdx = p
33730 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
33740 2d 31 5d 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d  -1];..      rc =
33750 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33760 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  te(pParent->pDbP
33770 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
33780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33790 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
337a0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
337b0 45 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  E.        if( pP
337c0 61 67 65 2d 3e 68 61 73 44 61 74 61 0a 20 20 20  age->hasData.   
337d0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e        && pPage->
337e0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20  nOverflow==1.   
337f0 20 20 20 20 20 20 26 26 20 70 50 61 67 65 2d 3e        && pPage->
33800 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50  aOvfl[0].idx==pP
33810 61 67 65 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20  age->nCell.     
33820 20 20 20 20 26 26 20 70 50 61 72 65 6e 74 2d 3e      && pParent->
33830 70 67 6e 6f 21 3d 31 0a 20 20 20 20 20 20 20 20  pgno!=1.        
33840 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
33850 6c 6c 3d 3d 69 49 64 78 0a 20 20 20 20 20 20 20  ll==iIdx.       
33860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
33870 20 43 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75   Call balance_qu
33880 69 63 6b 28 29 20 74 6f 20 63 72 65 61 74 65 20  ick() to create 
33890 61 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 6f 66  a new sibling of
338a0 20 70 50 61 67 65 20 6f 6e 20 77 68 69 63 68 0a   pPage on which.
338b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
338c0 73 74 6f 72 65 20 74 68 65 20 6f 76 65 72 66 6c  store the overfl
338d0 6f 77 20 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65  ow cell. balance
338e0 5f 71 75 69 63 6b 28 29 20 69 6e 73 65 72 74 73  _quick() inserts
338f0 20 61 20 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20   a new cell.    
33900 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50        ** into pP
33910 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
33920 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 6f   cause pParent o
33930 76 65 72 66 6c 6f 77 2e 20 49 66 20 74 68 69 73  verflow. If this
33940 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61  .          ** ha
33950 70 70 65 6e 73 2c 20 74 68 65 20 6e 65 78 74 20  ppens, the next 
33960 69 6e 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68  interation of th
33970 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
33980 61 6c 61 6e 63 65 20 70 50 61 72 65 6e 74 20 0a  alance pParent .
33990 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
339a0 20 65 69 74 68 65 72 20 62 61 6c 61 6e 63 65 5f   either balance_
339b0 6e 6f 6e 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c  nonroot() or bal
339c0 61 6e 63 65 5f 64 65 65 70 65 72 28 29 2e 20 55  ance_deeper(). U
339d0 6e 74 69 6c 20 74 68 69 73 0a 20 20 20 20 20 20  ntil this.      
339e0 20 20 20 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20      ** happens, 
339f0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  the overflow cel
33a00 6c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  l is stored in t
33a10 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  he aBalanceQuick
33a20 53 70 61 63 65 5b 5d 0a 20 20 20 20 20 20 20 20  Space[].        
33a30 20 20 2a 2a 20 62 75 66 66 65 72 2e 20 0a 20 20    ** buffer. .  
33a40 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
33a50 20 20 20 20 20 2a 2a 20 54 68 65 20 70 75 72 70       ** The purp
33a60 6f 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  ose of the follo
33a70 77 69 6e 67 20 61 73 73 65 72 74 28 29 20 69 73  wing assert() is
33a80 20 74 6f 20 63 68 65 63 6b 20 74 68 61 74 20 6f   to check that o
33a90 6e 6c 79 20 61 0a 20 20 20 20 20 20 20 20 20 20  nly a.          
33aa0 2a 2a 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74  ** single call t
33ab0 6f 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  o balance_quick(
33ac0 29 20 69 73 20 6d 61 64 65 20 66 6f 72 20 65 61  ) is made for ea
33ad0 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a  ch call to this.
33ae0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e            ** fun
33af0 63 74 69 6f 6e 2e 20 49 66 20 74 68 69 73 20 77  ction. If this w
33b00 65 72 65 20 6e 6f 74 20 76 65 72 69 66 69 65 64  ere not verified
33b10 2c 20 61 20 73 75 62 74 6c 65 20 62 75 67 20 69  , a subtle bug i
33b20 6e 76 6f 6c 76 69 6e 67 20 72 65 75 73 65 0a 20  nvolving reuse. 
33b30 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 74           ** of t
33b40 68 65 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  he aBalanceQuick
33b50 53 70 61 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e  Space[] might sn
33b60 65 61 6b 20 69 6e 2e 0a 20 20 20 20 20 20 20 20  eak in..        
33b70 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61    */.          a
33b80 73 73 65 72 74 28 20 28 62 61 6c 61 6e 63 65 5f  ssert( (balance_
33b90 71 75 69 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d  quick_called++)=
33ba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
33bb0 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69  rc = balance_qui
33bc0 63 6b 28 70 50 61 72 65 6e 74 2c 20 70 50 61 67  ck(pParent, pPag
33bd0 65 2c 20 61 42 61 6c 61 6e 63 65 51 75 69 63 6b  e, aBalanceQuick
33be0 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
33bf0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
33c00 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
33c10 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
33c20 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e  , call balance_n
33c30 6f 6e 72 6f 6f 74 28 29 20 74 6f 20 72 65 64 69  onroot() to redi
33c40 73 74 72 69 62 75 74 65 20 63 65 6c 6c 73 0a 20  stribute cells. 
33c50 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77           ** betw
33c60 65 65 6e 20 70 50 61 67 65 20 61 6e 64 20 75 70  een pPage and up
33c70 20 74 6f 20 32 20 6f 66 20 69 74 73 20 73 69 62   to 2 of its sib
33c80 6c 69 6e 67 20 70 61 67 65 73 2e 20 54 68 69 73  ling pages. This
33c90 20 69 6e 76 6f 6c 76 65 73 0a 20 20 20 20 20 20   involves.      
33ca0 20 20 20 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67      ** modifying
33cb0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
33cc0 20 70 50 61 72 65 6e 74 2c 20 77 68 69 63 68 20   pParent, which 
33cd0 6d 61 79 20 63 61 75 73 65 20 70 50 61 72 65 6e  may cause pParen
33ce0 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 2a  t to.          *
33cf0 2a 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  * become overful
33d00 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
33d10 54 68 65 20 6e 65 78 74 20 69 74 65 72 61 74 69  The next iterati
33d20 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f  on of the do-loo
33d30 70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77  p.          ** w
33d40 69 6c 6c 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ill balance the 
33d50 70 61 72 65 6e 74 20 70 61 67 65 20 74 6f 20 63  parent page to c
33d60 6f 72 72 65 63 74 20 74 68 69 73 2e 0a 20 20 20  orrect this..   
33d70 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
33d80 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 70       ** If the p
33d90 61 72 65 6e 74 20 70 61 67 65 20 62 65 63 6f 6d  arent page becom
33da0 65 73 20 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65  es overfull, the
33db0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f   overflow cell o
33dc0 72 20 63 65 6c 6c 73 0a 20 20 20 20 20 20 20 20  r cells.        
33dd0 20 20 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20    ** are stored 
33de0 69 6e 20 74 68 65 20 70 53 70 61 63 65 20 62 75  in the pSpace bu
33df0 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 69  ffer allocated i
33e00 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 6c 6f 77  mmediately below
33e10 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  . .          ** 
33e20 41 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65  A subsequent ite
33e30 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f  ration of the do
33e40 2d 6c 6f 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20  -loop will deal 
33e50 77 69 74 68 20 74 68 69 73 20 62 79 0a 20 20 20  with this by.   
33e60 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e         ** callin
33e70 67 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  g balance_nonroo
33e80 74 28 29 20 28 62 61 6c 61 6e 63 65 5f 64 65 65  t() (balance_dee
33e90 70 65 72 28 29 20 6d 61 79 20 62 65 20 63 61 6c  per() may be cal
33ea0 6c 65 64 20 66 69 72 73 74 2c 0a 20 20 20 20 20  led first,.     
33eb0 20 20 20 20 20 2a 2a 20 62 75 74 20 69 74 20 64       ** but it d
33ec0 6f 65 73 6e 27 74 20 64 65 61 6c 20 77 69 74 68  oesn't deal with
33ed0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20   overflow cells 
33ee0 2d 20 6a 75 73 74 20 6d 6f 76 65 73 20 74 68 65  - just moves the
33ef0 6d 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 20  m to a.         
33f00 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 70 61   ** different pa
33f10 67 65 29 2e 20 4f 6e 63 65 20 74 68 69 73 20 73  ge). Once this s
33f20 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
33f30 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
33f40 74 28 29 20 0a 20 20 20 20 20 20 20 20 20 20 2a  t() .          *
33f50 2a 20 68 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c  * has completed,
33f60 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72   it is safe to r
33f70 65 6c 65 61 73 65 20 74 68 65 20 70 53 70 61 63  elease the pSpac
33f80 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
33f90 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
33fa0 65 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c  e previous call,
33fb0 20 61 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   as the overflow
33fc0 20 63 65 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20   cell data will 
33fd0 68 61 76 65 20 62 65 65 6e 20 0a 20 20 20 20 20  have been .     
33fe0 20 20 20 20 20 2a 2a 20 63 6f 70 69 65 64 20 65       ** copied e
33ff0 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 20 62  ither into the b
34000 6f 64 79 20 6f 66 20 61 20 64 61 74 61 62 61 73  ody of a databas
34010 65 20 70 61 67 65 20 6f 72 20 69 6e 74 6f 20 74  e page or into t
34020 68 65 20 6e 65 77 0a 20 20 20 20 20 20 20 20 20  he new.         
34030 20 2a 2a 20 70 53 70 61 63 65 20 62 75 66 66 65   ** pSpace buffe
34040 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  r passed to the 
34050 6c 61 74 74 65 72 20 63 61 6c 6c 20 74 6f 20 62  latter call to b
34060 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
34070 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
34080 20 20 20 20 20 20 20 20 20 75 38 20 2a 70 53 70           u8 *pSp
34090 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
340a0 65 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42  eMalloc(pCur->pB
340b0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
340c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c          rc = bal
340d0 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61  ance_nonroot(pPa
340e0 72 65 6e 74 2c 20 69 49 64 78 2c 20 70 53 70 61  rent, iIdx, pSpa
340f0 63 65 2c 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20  ce, iPage==1);. 
34100 20 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72           if( pFr
34110 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ee ){.          
34120 20 20 2f 2a 20 49 66 20 70 46 72 65 65 20 69 73    /* If pFree is
34130 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f   not NULL, it po
34140 69 6e 74 73 20 74 6f 20 74 68 65 20 70 53 70 61  ints to the pSpa
34150 63 65 20 62 75 66 66 65 72 20 75 73 65 64 20 0a  ce buffer used .
34160 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62              ** b
34170 79 20 61 20 70 72 65 76 69 6f 75 73 20 63 61 6c  y a previous cal
34180 6c 20 74 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  l to balance_non
34190 72 6f 6f 74 28 29 2e 20 49 74 73 20 63 6f 6e 74  root(). Its cont
341a0 65 6e 74 73 20 61 72 65 0a 20 20 20 20 20 20 20  ents are.       
341b0 20 20 20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72       ** now stor
341c0 65 64 20 65 69 74 68 65 72 20 6f 6e 20 72 65 61  ed either on rea
341d0 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 73  l database pages
341e0 20 6f 72 20 77 69 74 68 69 6e 20 74 68 65 20 0a   or within the .
341f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e              ** n
34200 65 77 20 70 53 70 61 63 65 20 62 75 66 66 65 72  ew pSpace buffer
34210 2c 20 73 6f 20 69 74 20 6d 61 79 20 62 65 20 73  , so it may be s
34220 61 66 65 6c 79 20 66 72 65 65 64 20 68 65 72 65  afely freed here
34230 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
34240 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
34250 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 20  (pFree);.       
34260 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
34270 2f 2a 20 54 68 65 20 70 53 70 61 63 65 20 62 75  /* The pSpace bu
34280 66 66 65 72 20 77 69 6c 6c 20 62 65 20 66 72 65  ffer will be fre
34290 65 64 20 61 66 74 65 72 20 74 68 65 20 6e 65 78  ed after the nex
342a0 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20  t call to.      
342b0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e      ** balance_n
342c0 6f 6e 72 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73  onroot(), or jus
342d0 74 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  t before this fu
342e0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20  nction returns, 
342f0 77 68 69 63 68 65 76 65 72 0a 20 20 20 20 20 20  whichever.      
34300 20 20 20 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72      ** comes fir
34310 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  st. */.         
34320 20 70 46 72 65 65 20 3d 20 70 53 70 61 63 65 3b   pFree = pSpace;
34330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34340 20 7d 0a 0a 20 20 20 20 20 20 70 50 61 67 65 2d   }..      pPage-
34350 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
34360 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  .      /* The ne
34370 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  xt iteration of 
34380 74 68 65 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61  the do-loop bala
34390 6e 63 65 73 20 74 68 65 20 70 61 72 65 6e 74 20  nces the parent 
343a0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  page. */.      r
343b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
343c0 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
343d0 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
343e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
343f0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
34400 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
34410 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46 72  ite3PageFree(pFr
34420 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
34430 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
34440 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
34450 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
34460 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
34470 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
34480 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
34490 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
344a0 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
344b0 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
344c0 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
344d0 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
344e0 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
344f0 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
34500 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
34510 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
34520 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
34530 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
34540 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
34550 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
34560 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
34570 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
34580 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
34590 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
345a0 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
345b0 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
345c0 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
345d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 65  **.** If the see
345e0 6b 52 65 73 75 6c 74 20 70 61 72 61 6d 65 74 65  kResult paramete
345f0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
34600 68 65 6e 20 61 20 73 75 63 63 65 73 73 66 75 6c  hen a successful
34610 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69   call to.** sqli
34620 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29  te3BtreeMoveto()
34630 20 74 6f 20 73 65 65 6b 20 63 75 72 73 6f 72 20   to seek cursor 
34640 70 43 75 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e  pCur to (pKey, n
34650 4b 65 79 29 20 68 61 73 20 61 6c 72 65 61 64 79  Key) has already
34660 0a 2a 2a 20 62 65 65 6e 20 70 65 72 66 6f 72 6d  .** been perform
34670 65 64 2e 20 73 65 65 6b 52 65 73 75 6c 74 20 69  ed. seekResult i
34680 73 20 74 68 65 20 73 65 61 72 63 68 20 72 65 73  s the search res
34690 75 6c 74 20 72 65 74 75 72 6e 65 64 20 28 61 20  ult returned (a 
346a0 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62  negative.** numb
346b0 65 72 20 69 66 20 70 43 75 72 20 70 6f 69 6e 74  er if pCur point
346c0 73 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  s at an entry th
346d0 61 74 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68  at is smaller th
346e0 61 6e 20 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c  an (pKey, nKey),
346f0 20 6f 72 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76   or.** a positiv
34700 65 20 76 61 6c 75 65 20 69 66 20 70 43 75 72 20  e value if pCur 
34710 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 65 74 72  points at an etr
34720 79 20 74 68 61 74 20 69 73 20 6c 61 72 67 65 72  y that is larger
34730 20 74 68 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c   than .** (pKey,
34740 20 6e 4b 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20   nKey)). .**.** 
34750 49 66 20 74 68 65 20 73 65 65 6b 52 65 73 75 6c  If the seekResul
34760 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  t parameter is 0
34770 2c 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 43  , then cursor pC
34780 75 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ur may point to 
34790 61 6e 79 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72  any .** entry or
347a0 20 74 6f 20 6e 6f 20 65 6e 74 72 79 20 61 74 20   to no entry at 
347b0 61 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73  all. In this cas
347c0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
347d0 68 61 73 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74  has to seek.** t
347e0 68 65 20 63 75 72 73 6f 72 20 62 65 66 6f 72 65  he cursor before
347f0 20 74 68 65 20 6e 65 77 20 6b 65 79 20 63 61 6e   the new key can
34800 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
34810 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
34820 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72  eInsert(.  BtCur
34830 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
34840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
34850 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
34860 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20  e table of this 
34870 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73  cursor */.  cons
34880 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
34890 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
348a0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77  e key of the new
348b0 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e   record */.  con
348c0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  st void *pData, 
348d0 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54  int nData,  /* T
348e0 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e  he data of the n
348f0 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ew record */.  i
34900 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
34910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34920 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
34930 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65   0 bytes to appe
34940 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20  nd to data */.  
34950 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 2c 20  int appendBias, 
34960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34970 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
34980 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65  s likely an appe
34990 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b  nd */.  int seek
349a0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
349b0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
349c0 20 6f 66 20 70 72 69 6f 72 20 73 71 6c 69 74 65   of prior sqlite
349d0 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 63  3BtreeMoveto() c
349e0 61 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  all */.){.  int 
349f0 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20  rc;.  int loc = 
34a00 73 65 65 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e  seekResult;.  in
34a10 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
34a20 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
34a30 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
34a40 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
34a50 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34a60 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
34a70 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
34a80 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
34a90 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
34aa0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
34ab0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
34ac0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
34ad0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
34ae0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
34af0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  E );.  assert( !
34b00 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
34b10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
34b20 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 61 73 73  >wrFlag );.  ass
34b30 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
34b40 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
34b50 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
34b60 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d  pCur->pKeyInfo!=
34b70 30 2c 20 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  0, 2) );..  /* I
34b80 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 73  f this is an ins
34b90 65 72 74 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ert into a table
34ba0 20 62 2d 74 72 65 65 2c 20 69 6e 76 61 6c 69 64   b-tree, invalid
34bb0 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
34bc0 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f   .  ** cursors o
34bd0 70 65 6e 20 6f 6e 20 74 68 65 20 72 6f 77 20 62  pen on the row b
34be0 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 28 61  eing replaced (a
34bf0 73 73 75 6d 69 6e 67 20 74 68 69 73 20 69 73 20  ssuming this is 
34c00 61 20 72 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f  a replace.  ** o
34c10 70 65 72 61 74 69 6f 6e 20 2d 20 69 66 20 69 74  peration - if it
34c20 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c   is not, the fol
34c30 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f  lowing is a no-o
34c40 70 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 43  p).  */.  if( pC
34c50 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20  ur->pKeyInfo==0 
34c60 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
34c70 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
34c80 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
34c90 6f 74 2c 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20  ot, nKey, 0);.  
34ca0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  }..  if( pCur->e
34cb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
34cc0 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
34cd0 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20  n pCur->skip;.  
34ce0 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65  }..  /* Save the
34cf0 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e   positions of an
34d00 79 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  y other cursors 
34d10 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  open on this tab
34d20 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e  le..  **.  ** In
34d30 20 73 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65   some cases, the
34d40 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
34d50 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 62 65  BtreeMoveto() be
34d60 6c 6f 77 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  low is a no-op. 
34d70 46 6f 72 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65  For.  ** example
34d80 2c 20 77 68 65 6e 20 69 6e 73 65 72 74 69 6e 67  , when inserting
34d90 20 64 61 74 61 20 69 6e 74 6f 20 61 20 74 61 62   data into a tab
34da0 6c 65 20 77 69 74 68 20 61 75 74 6f 2d 67 65 6e  le with auto-gen
34db0 65 72 61 74 65 64 20 69 6e 74 65 67 65 72 0a 20  erated integer. 
34dc0 20 2a 2a 20 6b 65 79 73 2c 20 74 68 65 20 56 44   ** keys, the VD
34dd0 42 45 20 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73  BE layer invokes
34de0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
34df0 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
34e00 74 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65  t the .  ** inte
34e10 67 65 72 20 6b 65 79 20 74 6f 20 75 73 65 2e 20  ger key to use. 
34e20 49 74 20 74 68 65 6e 20 63 61 6c 6c 73 20 74 68  It then calls th
34e30 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61  is function to a
34e40 63 74 75 61 6c 6c 79 20 69 6e 73 65 72 74 20 74  ctually insert t
34e50 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e  he .  ** data in
34e60 74 6f 20 74 68 65 20 69 6e 74 6b 65 79 20 42 2d  to the intkey B-
34e70 54 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Tree. In this ca
34e80 73 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  se sqlite3BtreeM
34e90 6f 76 65 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a  oveto() recogniz
34ea0 65 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  es.  ** that the
34eb0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
34ec0 64 79 20 77 68 65 72 65 20 69 74 20 6e 65 65 64  dy where it need
34ed0 73 20 74 6f 20 62 65 20 61 6e 64 20 72 65 74 75  s to be and retu
34ee0 72 6e 73 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  rns without.  **
34ef0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e   doing any work.
34f00 20 54 6f 20 61 76 6f 69 64 20 74 68 77 61 72 74   To avoid thwart
34f10 69 6e 67 20 74 68 65 73 65 20 6f 70 74 69 6d 69  ing these optimi
34f20 7a 61 74 69 6f 6e 73 2c 20 69 74 20 69 73 20 69  zations, it is i
34f30 6d 70 6f 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f  mportant.  ** no
34f40 74 20 74 6f 20 63 6c 65 61 72 20 74 68 65 20 63  t to clear the c
34f50 75 72 73 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f  ursor here..  */
34f60 0a 20 20 69 66 28 0a 20 20 20 20 53 51 4c 49 54  .  if(.    SQLIT
34f70 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
34f80 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
34f90 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
34fa0 70 43 75 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20  pCur)) || (!loc 
34fb0 26 26 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  &&.    SQLITE_OK
34fc0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
34fd0 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
34fe0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
34ff0 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
35000 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e    )){.    return
35010 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
35020 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
35030 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
35040 20 28 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d   (pCur->eState==
35050 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26  CURSOR_INVALID &
35060 26 20 6c 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61  & loc) );..  pPa
35070 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
35080 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
35090 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
350a0 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e  >intKey || nKey>
350b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
350c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21  pPage->leaf || !
350d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
350e0 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45 52  .  TRACE(("INSER
350f0 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79  T: table=%d nkey
35100 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70  =%lld ndata=%d p
35110 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  age=%d %s\n",.  
35120 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67          pCur->pg
35130 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44  noRoot, nKey, nD
35140 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ata, pPage->pgno
35150 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d  ,.          loc=
35160 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22  =0 ? "overwrite"
35170 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29   : "new entry"))
35180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
35190 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
351a0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
351b0 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c  (pBt);.  newCell
351c0 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63   = pBt->pTmpSpac
351d0 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c  e;.  if( newCell
351e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
351f0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20  ITE_NOMEM;.  rc 
35200 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61  = fillInCell(pPa
35210 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65  ge, newCell, pKe
35220 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20  y, nKey, pData, 
35230 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73  nData, nZero, &s
35240 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20  zNew);.  if( rc 
35250 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72  ) goto end_inser
35260 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  t;.  assert( szN
35270 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  ew==cellSizePtr(
35280 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20  pPage, newCell) 
35290 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e  );.  assert( szN
352a0 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  ew<=MX_CELL_SIZE
352b0 28 70 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d  (pBt) );.  idx =
352c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
352d0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
352e0 20 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75   loc==0 ){.    u
352f0 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73  16 szOld;.    as
35300 73 65 72 74 28 20 69 64 78 3c 70 50 61 67 65 2d  sert( idx<pPage-
35310 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
35320 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35330 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
35340 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
35350 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
35360 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
35370 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
35380 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
35390 64 78 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  dx);.    if( !pP
353a0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
353b0 20 20 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c     memcpy(newCel
353c0 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a  l, oldCell, 4);.
353d0 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20      }.    szOld 
353e0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
353f0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
35400 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c     rc = clearCel
35410 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c  l(pPage, oldCell
35420 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
35430 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
35440 0a 20 20 20 20 72 63 20 3d 20 64 72 6f 70 43 65  .    rc = dropCe
35450 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 73  ll(pPage, idx, s
35460 7a 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20 72  zOld);.    if( r
35470 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  c!=SQLITE_OK ) {
35480 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
35490 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
354a0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
354b0 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
354c0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
354d0 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
354e0 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
354f0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
35500 61 67 65 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age];.  }else{. 
35510 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
35520 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20  ->leaf );.  }.  
35530 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
35540 70 50 61 67 65 2c 20 69 64 78 2c 20 6e 65 77 43  pPage, idx, newC
35550 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30  ell, szNew, 0, 0
35560 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
35570 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
35580 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20  age->nCell>0 || 
35590 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
355a0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  >0 );..  /* If n
355b0 6f 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  o error has occu
355c0 72 65 64 20 61 6e 64 20 70 50 61 67 65 20 68 61  red and pPage ha
355d0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  s an overflow ce
355e0 6c 6c 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65  ll, call balance
355f0 28 29 20 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69  () .  ** to redi
35600 73 74 72 69 62 75 74 65 20 74 68 65 20 63 65 6c  stribute the cel
35610 6c 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  ls within the tr
35620 65 65 2e 20 53 69 6e 63 65 20 62 61 6c 61 6e 63  ee. Since balanc
35630 65 28 29 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a  e() may move.  *
35640 2a 20 74 68 65 20 63 75 72 73 6f 72 2c 20 7a 65  * the cursor, ze
35650 72 6f 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  ro the BtCursor.
35660 69 6e 66 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42  info.nSize and B
35670 74 43 75 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65  tCursor.validNKe
35680 79 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  y.  ** variables
35690 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76  ..  **.  ** Prev
356a0 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66  ious versions of
356b0 20 53 51 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d   SQLite called m
356c0 6f 76 65 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d  oveToRoot() to m
356d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 0a 20  ove the cursor. 
356e0 20 2a 2a 20 62 61 63 6b 20 74 6f 20 74 68 65 20   ** back to the 
356f0 72 6f 6f 74 20 70 61 67 65 20 61 73 20 62 61 6c  root page as bal
35700 61 6e 63 65 28 29 20 75 73 65 64 20 74 6f 20 69  ance() used to i
35710 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 6f  nvalidate the co
35720 6e 74 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42  ntents.  ** of B
35730 74 43 75 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d  tCursor.apPage[]
35740 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 61 69   and BtCursor.ai
35750 49 64 78 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f  Idx[]. Instead o
35760 66 20 64 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20  f doing that,.  
35770 2a 2a 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  ** set the curso
35780 72 20 73 74 61 74 65 20 74 6f 20 22 69 6e 76 61  r state to "inva
35790 6c 69 64 22 2e 20 54 68 69 73 20 6d 61 6b 65 73  lid". This makes
357a0 20 63 6f 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f   common insert o
357b0 70 65 72 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73  perations.  ** s
357c0 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 2e 0a  lightly faster..
357d0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20    **.  ** There 
357e0 69 73 20 61 20 73 75 62 74 6c 65 20 62 75 74 20  is a subtle but 
357f0 69 6d 70 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69  important optimi
35800 7a 61 74 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e  zation here too.
35810 20 57 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a   When inserting.
35820 20 20 2a 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65    ** multiple re
35830 63 6f 72 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e  cords into an in
35840 74 6b 65 79 20 62 2d 74 72 65 65 20 75 73 69 6e  tkey b-tree usin
35850 67 20 61 20 73 69 6e 67 6c 65 20 63 75 72 73 6f  g a single curso
35860 72 20 28 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68  r (as can.  ** h
35870 61 70 70 65 6e 20 77 68 69 6c 65 20 70 72 6f 63  appen while proc
35880 65 73 73 69 6e 67 20 61 6e 20 22 49 4e 53 45 52  essing an "INSER
35890 54 20 49 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43  T INTO ... SELEC
358a0 54 22 20 73 74 61 74 65 6d 65 6e 74 29 2c 20 69  T" statement), i
358b0 74 0a 20 20 2a 2a 20 69 73 20 61 64 76 61 6e 74  t.  ** is advant
358c0 61 67 65 6f 75 73 20 74 6f 20 6c 65 61 76 65 20  ageous to leave 
358d0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  the cursor point
358e0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
358f0 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68  entry in.  ** th
35900 65 20 62 2d 74 72 65 65 20 69 66 20 70 6f 73 73  e b-tree if poss
35910 69 62 6c 65 2e 20 49 66 20 74 68 65 20 63 75 72  ible. If the cur
35920 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
35930 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74  ting to the last
35940 0a 20 20 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74  .  ** entry in t
35950 68 65 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68  he table, and th
35960 65 20 6e 65 78 74 20 72 6f 77 20 69 6e 73 65 72  e next row inser
35970 74 65 64 20 68 61 73 20 61 6e 20 69 6e 74 65 67  ted has an integ
35980 65 72 20 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67  er key.  ** larg
35990 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67  er than the larg
359a0 65 73 74 20 65 78 69 73 74 69 6e 67 20 6b 65 79  est existing key
359b0 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
359c0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 0a 20   to insert the. 
359d0 20 2a 2a 20 72 6f 77 20 77 69 74 68 6f 75 74 20   ** row without 
359e0 73 65 65 6b 69 6e 67 20 74 68 65 20 63 75 72 73  seeking the curs
359f0 6f 72 2e 20 54 68 69 73 20 63 61 6e 20 62 65 20  or. This can be 
35a00 61 20 62 69 67 20 70 65 72 66 6f 72 6d 61 6e 63  a big performanc
35a10 65 20 62 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20  e boost..  */.  
35a20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
35a30 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
35a40 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
35a50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
35a60 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   && pPage->nOver
35a70 66 6c 6f 77 20 29 7b 0a 20 20 20 20 72 63 20 3d  flow ){.    rc =
35a80 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
35a90 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b  .    /* Must mak
35aa0 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77  e sure nOverflow
35ab0 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65 72   is reset to zer
35ac0 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62 61  o even if the ba
35ad0 6c 61 6e 63 65 28 29 0a 20 20 20 20 2a 2a 20 66  lance().    ** f
35ae0 61 69 6c 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64  ails. Internal d
35af0 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
35b00 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
35b10 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
35b20 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65  .    ** Also, se
35b30 74 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  t the cursor sta
35b40 74 65 20 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54  te to invalid. T
35b50 68 69 73 20 73 74 6f 70 73 20 73 61 76 65 43 75  his stops saveCu
35b60 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20  rsorPosition(). 
35b70 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e     ** from tryin
35b80 67 20 74 6f 20 73 61 76 65 20 74 68 65 20 63 75  g to save the cu
35b90 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f  rrent position o
35ba0 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 2a  f the cursor.  *
35bb0 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  /.    pCur->apPa
35bc0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
35bd0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
35be0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
35bf0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
35c00 44 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  D;.  }.  assert(
35c10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
35c20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65  ur->iPage]->nOve
35c30 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64  rflow==0 );..end
35c40 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
35c50 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
35c60 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
35c70 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
35c80 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
35c90 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
35ca0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
35cb0 61 74 20 61 20 61 72 62 69 74 72 61 72 79 20 6c  at a arbitrary l
35cc0 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  ocation..*/.int 
35cd0 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65  sqlite3BtreeDele
35ce0 74 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  te(BtCursor *pCu
35cf0 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  r){.  Btree *p =
35d00 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
35d10 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
35d20 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
35d30 20 20 20 20 20 20 0a 20 20 69 6e 74 20 72 63 3b        .  int rc;
35d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35d60 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
35d70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35d90 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
35da0 6f 20 64 65 6c 65 74 65 20 63 65 6c 6c 20 66 72  o delete cell fr
35db0 6f 6d 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  om */.  unsigned
35dc0 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20   char *pCell;   
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35de0 50 6f 69 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20  Pointer to cell 
35df0 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
35e00 6e 74 20 69 43 65 6c 6c 49 64 78 3b 20 20 20 20  nt iCellIdx;    
35e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
35e30 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
35e40 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 44 65 70  /.  int iCellDep
35e50 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
35e60 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 70 74           /* Dept
35e70 68 20 6f 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69  h of node contai
35e80 6e 69 6e 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a  ning pCell */ ..
35e90 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
35ea0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
35eb0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
35ec0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
35ed0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
35ee0 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d  .  assert( !pBt-
35ef0 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61  >readOnly );.  a
35f00 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72 46  ssert( pCur->wrF
35f10 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74 28  lag );.  assert(
35f20 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
35f30 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72  ableLock(p, pCur
35f40 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72  ->pgnoRoot, pCur
35f50 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32  ->pKeyInfo!=0, 2
35f60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ) );.  assert( !
35f70 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
35f80 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
35f90 6f 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45  ot) );..  if( NE
35fa0 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
35fb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43  pCur->iPage]>=pC
35fc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
35fd0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20  >iPage]->nCell) 
35fe0 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 70 43 75  .   || NEVER(pCu
35ff0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
36000 52 5f 56 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20  R_VALID).  ){.  
36010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36020 45 52 52 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74  ERROR;  /* Somet
36030 68 69 6e 67 20 68 61 73 20 67 6f 6e 65 20 61 77  hing has gone aw
36040 72 79 2e 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a  ry. */.  }..  /*
36050 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 65   If this is a de
36060 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 74  lete operation t
36070 6f 20 72 65 6d 6f 76 65 20 61 20 72 6f 77 20 66  o remove a row f
36080 72 6f 6d 20 61 20 74 61 62 6c 65 20 62 2d 74 72  rom a table b-tr
36090 65 65 2c 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64  ee,.  ** invalid
360a0 61 74 65 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62  ate any incrblob
360b0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
360c0 20 74 68 65 20 72 6f 77 20 62 65 69 6e 67 20 64   the row being d
360d0 65 6c 65 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66  eleted.  */.  if
360e0 28 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  ( pCur->pKeyInfo
360f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c  ==0 ){.    inval
36100 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
36110 73 6f 72 73 28 70 2c 20 70 43 75 72 2d 3e 70 67  sors(p, pCur->pg
36120 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e  noRoot, pCur->in
36130 66 6f 2e 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d  fo.nKey, 0);.  }
36140 0a 0a 20 20 69 43 65 6c 6c 44 65 70 74 68 20 3d  ..  iCellDepth =
36150 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
36160 69 43 65 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d  iCellIdx = pCur-
36170 3e 61 69 49 64 78 5b 69 43 65 6c 6c 44 65 70 74  >aiIdx[iCellDept
36180 68 5d 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43  h];.  pPage = pC
36190 75 72 2d 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c  ur->apPage[iCell
361a0 44 65 70 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20  Depth];.  pCell 
361b0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
361c0 2c 20 69 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20  , iCellIdx);..  
361d0 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  /* If the page c
361e0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6e  ontaining the en
361f0 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 69 73  try to delete is
36200 20 6e 6f 74 20 61 20 6c 65 61 66 20 70 61 67 65   not a leaf page
36210 2c 20 6d 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20  , move.  ** the 
36220 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
36230 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74  rgest entry in t
36240 68 65 20 74 72 65 65 20 74 68 61 74 20 69 73 20  he tree that is 
36250 73 6d 61 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a  smaller than.  *
36260 2a 20 74 68 65 20 65 6e 74 72 79 20 62 65 69 6e  * the entry bein
36270 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
36280 63 65 6c 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63  cell will replac
36290 65 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e 67  e the cell being
362a0 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72   deleted.  ** fr
362b0 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
362c0 6e 6f 64 65 2e 20 54 68 65 20 27 70 72 65 76 69  node. The 'previ
362d0 6f 75 73 27 20 65 6e 74 72 79 20 69 73 20 75 73  ous' entry is us
362e0 65 64 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74  ed for this inst
362f0 65 61 64 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ead.  ** of the 
36300 27 6e 65 78 74 27 20 65 6e 74 72 79 2c 20 61 73  'next' entry, as
36310 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
36320 74 72 79 20 69 73 20 61 6c 77 61 79 73 20 61 20  try is always a 
36330 70 61 72 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  part of the.  **
36340 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
36350 20 62 79 20 74 68 65 20 63 68 69 6c 64 20 70 61   by the child pa
36360 67 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 62  ge of the cell b
36370 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 20 54 68  eing deleted. Th
36380 69 73 20 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61  is makes.  ** ba
36390 6c 61 6e 63 69 6e 67 20 74 68 65 20 74 72 65 65  lancing the tree
363a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
363b0 65 6c 65 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  elete operation 
363c0 65 61 73 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66  easier.  */.  if
363d0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
363e0 7b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73 65  {.    int notUse
363f0 64 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  d;.    if( SQLIT
36400 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
36410 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
36420 28 70 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  (pCur, &notUsed)
36430 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
36440 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
36450 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70  .  /* Save the p
36460 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
36470 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70  other cursors op
36480 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  en on this table
36490 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b   before.  ** mak
364a0 69 6e 67 20 61 6e 79 20 6d 6f 64 69 66 69 63 61  ing any modifica
364b0 74 69 6f 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20  tions. Make the 
364c0 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
364d0 74 68 65 20 65 6e 74 72 79 20 74 6f 20 62 65 20  the entry to be 
364e0 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64 20 77 72  .  ** deleted wr
364f0 69 74 61 62 6c 65 2e 20 54 68 65 6e 20 66 72 65  itable. Then fre
36500 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  e any overflow p
36510 61 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ages associated 
36520 77 69 74 68 20 74 68 65 20 0a 20 20 2a 2a 20 65  with the .  ** e
36530 6e 74 72 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79  ntry and finally
36540 20 72 65 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c   remove the cell
36550 20 69 74 73 65 6c 66 20 66 72 6f 6d 20 77 69 74   itself from wit
36560 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 20 2a  hin the page.  *
36570 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
36580 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
36590 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
365a0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
365b0 72 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  r)).   || SQLITE
365c0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
365d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
365e0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 0a 20 20  ge->pDbPage)).  
365f0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
36600 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
36610 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 0a 20 20  Page, pCell)).  
36620 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
36630 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50  rc = dropCell(pP
36640 61 67 65 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63  age, iCellIdx, c
36650 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
36660 2c 20 70 43 65 6c 6c 29 29 29 0a 20 20 29 7b 0a  , pCell))).  ){.
36670 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
36680 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
36690 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 77 61 73  cell deleted was
366a0 20 6e 6f 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20   not located on 
366b0 61 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  a leaf page, the
366c0 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a  n the cursor.  *
366d0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  * is currently p
366e0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
366f0 61 72 67 65 73 74 20 65 6e 74 72 79 20 69 6e 20  argest entry in 
36700 74 68 65 20 73 75 62 2d 74 72 65 65 20 68 65 61  the sub-tree hea
36710 64 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ded.  ** by the 
36720 63 68 69 6c 64 2d 70 61 67 65 20 6f 66 20 74 68  child-page of th
36730 65 20 63 65 6c 6c 20 74 68 61 74 20 77 61 73 20  e cell that was 
36740 6a 75 73 74 20 64 65 6c 65 74 65 64 20 66 72 6f  just deleted fro
36750 6d 20 61 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20  m an internal.  
36760 2a 2a 20 6e 6f 64 65 2e 20 54 68 65 20 63 65 6c  ** node. The cel
36770 6c 20 66 72 6f 6d 20 74 68 65 20 6c 65 61 66 20  l from the leaf 
36780 6e 6f 64 65 20 6e 65 65 64 73 20 74 6f 20 62 65  node needs to be
36790 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 69 6e   moved to the in
367a0 74 65 72 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65  ternal.  ** node
367b0 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
367c0 64 65 6c 65 74 65 64 20 63 65 6c 6c 2e 20 20 2a  deleted cell.  *
367d0 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  /.  if( !pPage->
367e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 4d 65 6d 50  leaf ){.    MemP
367f0 61 67 65 20 2a 70 4c 65 61 66 20 3d 20 70 43 75  age *pLeaf = pCu
36800 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
36810 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20  iPage];.    int 
36820 6e 43 65 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f 20  nCell;.    Pgno 
36830 6e 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  n = pCur->apPage
36840 5b 69 43 65 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e  [iCellDepth+1]->
36850 70 67 6e 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  pgno;.    unsign
36860 65 64 20 63 68 61 72 20 2a 70 54 6d 70 3b 0a 0a  ed char *pTmp;..
36870 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
36880 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
36890 66 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  f->nCell-1);.   
368a0 20 6e 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a   nCell = cellSiz
368b0 65 50 74 72 28 70 4c 65 61 66 2c 20 70 43 65 6c  ePtr(pLeaf, pCel
368c0 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
368d0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
368e0 29 3e 3d 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20  )>=nCell );..   
368f0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
36900 63 65 28 70 42 74 29 3b 0a 20 20 20 20 70 54 6d  ce(pBt);.    pTm
36910 70 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  p = pBt->pTmpSpa
36920 63 65 3b 0a 0a 20 20 20 20 69 66 28 20 53 51 4c  ce;..    if( SQL
36930 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
36940 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36950 70 4c 65 61 66 2d 3e 70 44 62 50 61 67 65 29 29  pLeaf->pDbPage))
36960 20 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45   .     || SQLITE
36970 5f 4f 4b 21 3d 28 72 63 20 3d 20 69 6e 73 65 72  _OK!=(rc = inser
36980 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  tCell(pPage, iCe
36990 6c 6c 49 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20  llIdx, pCell-4, 
369a0 6e 43 65 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e  nCell+4, pTmp, n
369b0 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54  )).     || SQLIT
369c0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70  E_OK!=(rc = drop
369d0 43 65 6c 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61  Cell(pLeaf, pLea
369e0 66 2d 3e 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c  f->nCell-1, nCel
369f0 6c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  l)).    ){.     
36a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
36a10 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61  }.  }..  /* Bala
36a20 6e 63 65 20 74 68 65 20 74 72 65 65 2e 20 49 66  nce the tree. If
36a30 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65 74   the entry delet
36a40 65 64 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ed was located o
36a50 6e 20 61 20 6c 65 61 66 20 70 61 67 65 2c 0a 20  n a leaf page,. 
36a60 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 75 72   ** then the cur
36a70 73 6f 72 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73  sor still points
36a80 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20 49   to that page. I
36a90 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
36aa0 66 69 72 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20  first.  ** call 
36ab0 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 72 65 70  to balance() rep
36ac0 61 69 72 73 20 74 68 65 20 74 72 65 65 2c 20 61  airs the tree, a
36ad0 6e 64 20 74 68 65 20 69 66 28 2e 2e 2e 29 20 63  nd the if(...) c
36ae0 6f 6e 64 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  ondition is.  **
36af0 20 6e 65 76 65 72 20 74 72 75 65 2e 0a 20 20 2a   never true..  *
36b00 2a 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  *.  ** Otherwise
36b10 2c 20 69 66 20 74 68 65 20 65 6e 74 72 79 20 64  , if the entry d
36b20 65 6c 65 74 65 64 20 77 61 73 20 6f 6e 20 61 6e  eleted was on an
36b30 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70   internal node p
36b40 61 67 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70  age, then.  ** p
36b50 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
36b60 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65  to the leaf page
36b70 20 66 72 6f 6d 20 77 68 69 63 68 20 61 20 63 65   from which a ce
36b80 6c 6c 20 77 61 73 20 72 65 6d 6f 76 65 64 20 74  ll was removed t
36b90 6f 0a 20 20 2a 2a 20 72 65 70 6c 61 63 65 20 74  o.  ** replace t
36ba0 68 65 20 63 65 6c 6c 20 64 65 6c 65 74 65 64 20  he cell deleted 
36bb0 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61  from the interna
36bc0 6c 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20  l node. This is 
36bd0 73 6c 69 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72  slightly.  ** tr
36be0 69 63 6b 79 20 61 73 20 74 68 65 20 6c 65 61 66  icky as the leaf
36bf0 20 6e 6f 64 65 20 6d 61 79 20 62 65 20 75 6e 64   node may be und
36c00 65 72 66 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20  erfull, and the 
36c10 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61  internal node ma
36c20 79 0a 20 20 2a 2a 20 62 65 20 65 69 74 68 65 72  y.  ** be either
36c30 20 75 6e 64 65 72 20 6f 72 20 6f 76 65 72 66 75   under or overfu
36c40 6c 6c 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ll. In this case
36c50 20 72 75 6e 20 74 68 65 20 62 61 6c 61 6e 63 69   run the balanci
36c60 6e 67 20 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a  ng algorithm.  *
36c70 2a 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f  * on the leaf no
36c80 64 65 20 66 69 72 73 74 2e 20 49 66 20 74 68 65  de first. If the
36c90 20 62 61 6c 61 6e 63 65 20 70 72 6f 63 65 65 64   balance proceed
36ca0 73 20 66 61 72 20 65 6e 6f 75 67 68 20 75 70 20  s far enough up 
36cb0 74 68 65 0a 20 20 2a 2a 20 74 72 65 65 20 74 68  the.  ** tree th
36cc0 61 74 20 77 65 20 63 61 6e 20 62 65 20 73 75 72  at we can be sur
36cd0 65 20 74 68 61 74 20 61 6e 79 20 70 72 6f 62 6c  e that any probl
36ce0 65 6d 20 69 6e 20 74 68 65 20 69 6e 74 65 72 6e  em in the intern
36cf0 61 6c 20 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a  al node has.  **
36d00 20 62 65 65 6e 20 63 6f 72 72 65 63 74 65 64 2c   been corrected,
36d10 20 73 6f 20 62 65 20 69 74 2e 20 4f 74 68 65 72   so be it. Other
36d20 77 69 73 65 2c 20 61 66 74 65 72 20 62 61 6c 61  wise, after bala
36d30 6e 63 69 6e 67 20 74 68 65 20 6c 65 61 66 20 6e  ncing the leaf n
36d40 6f 64 65 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74  ode,.  ** walk t
36d50 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 68 65  he cursor up the
36d60 20 74 72 65 65 20 74 6f 20 74 68 65 20 69 6e 74   tree to the int
36d70 65 72 6e 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62  ernal node and b
36d80 61 6c 61 6e 63 65 20 69 74 20 61 73 20 0a 20 20  alance it as .  
36d90 2a 2a 20 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72  ** well.  */.  r
36da0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
36db0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
36dc0 49 54 45 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e  ITE_OK && pCur->
36dd0 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70 74 68  iPage>iCellDepth
36de0 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70   ){.    while( p
36df0 43 75 72 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c  Cur->iPage>iCell
36e00 44 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20 72  Depth ){.      r
36e10 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
36e20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
36e30 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20  age--]);.    }. 
36e40 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
36e50 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  pCur);.  }..  if
36e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36e70 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
36e80 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72  t(pCur);.  }.  r
36e90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
36ea0 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
36eb0 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20 57 72  BTree table.  Wr
36ec0 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c  ite into *piTabl
36ed0 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  e the page.** nu
36ee0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72 6f 6f  mber for the roo
36ef0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e 65  t page of the ne
36f00 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  w table..**.** T
36f10 68 65 20 74 79 70 65 20 6f 66 20 74 79 70 65 20  he type of type 
36f20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
36f30 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d   the flags param
36f40 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  eter.  Only the.
36f50 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c  ** following val
36f60 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61 72 65  ues of flags are
36f70 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
36f80 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75 65 73  e.  Other values
36f90 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69   for.** flags mi
36fa0 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a  ght not work:.**
36fb0 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 49 4e  .**     BTREE_IN
36fc0 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41 46 44  TKEY|BTREE_LEAFD
36fd0 41 54 41 20 20 20 20 20 55 73 65 64 20 66 6f 72  ATA     Used for
36fe0 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69 74 68   SQL tables with
36ff0 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20   rowid keys.**  
37000 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44 41 54     BTREE_ZERODAT
37010 41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A               
37020 20 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20     Used for SQL 
37030 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69  indices.*/.stati
37040 63 20 69 6e 74 20 62 74 72 65 65 43 72 65 61 74  c int btreeCreat
37050 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
37060 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
37070 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42 74 53  nt flags){.  BtS
37080 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
37090 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
370a0 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67  pRoot;.  Pgno pg
370b0 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63  noRoot;.  int rc
370c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
370d0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
370e0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
370f0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
37100 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
37110 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
37120 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
37130 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
37140 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
37150 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  M.  rc = allocat
37160 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
37170 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f  &pRoot, &pgnoRoo
37180 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  t, 1, 0);.  if( 
37190 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
371a0 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20   rc;.  }.#else. 
371b0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
371c0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
371d0 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20   pgnoMove;      
371e0 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68  /* Move a page h
371f0 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d  ere to make room
37200 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
37210 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  ge */.    MemPag
37220 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a  e *pPageMove; /*
37230 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76   The page to mov
37240 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e to. */..    /*
37250 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20   Creating a new 
37260 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62  table may probab
37270 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ly require movin
37280 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61  g an existing da
37290 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f  tabase.    ** to
372a0 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74   make room for t
372b0 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f  he new tables ro
372c0 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65  ot page. In case
372d0 20 74 68 69 73 20 70 61 67 65 20 74 75 72 6e 73   this page turns
372e0 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62  .    ** out to b
372f0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
37300 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f  ge, delete all o
37310 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70  verflow page-map
37320 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68   caches.    ** h
37330 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73  eld by open curs
37340 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ors..    */.    
37350 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
37360 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
37370 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
37380 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b  e value of meta[
37390 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  3] from the data
373a0 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  base to determin
373b0 65 20 77 68 65 72 65 20 74 68 65 0a 20 20 20 20  e where the.    
373c0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
373d0 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68  the new table sh
373e0 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d  ould go. meta[3]
373f0 20 69 73 20 74 68 65 20 6c 61 72 67 65 73 74 20   is the largest 
37400 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
37410 20 63 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c   created so far,
37420 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74   so the new root
37430 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33  -page is (meta[3
37440 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ]+1)..    */.   
37450 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
37460 4d 65 74 61 28 70 2c 20 42 54 52 45 45 5f 4c 41  Meta(p, BTREE_LA
37470 52 47 45 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c  RGEST_ROOT_PAGE,
37480 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20   &pgnoRoot);.   
37490 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20   pgnoRoot++;..  
374a0 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f    /* The new roo
374b0 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  t-page may not b
374c0 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61  e allocated on a
374d0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
374e0 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a  e, or the.    **
374f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70 61   PENDING_BYTE pa
37500 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  ge..    */.    w
37510 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d  hile( pgnoRoot==
37520 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
37530 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a  t, pgnoRoot) ||.
37540 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74          pgnoRoot
37550 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
37560 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
37570 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20    pgnoRoot++;.  
37580 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
37590 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a  pgnoRoot>=3 );..
375a0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20      /* Allocate 
375b0 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67 65  a page. The page
375c0 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
375d0 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f 52  resides at pgnoR
375e0 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  oot will.    ** 
375f0 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  be moved to the 
37600 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 28  allocated page (
37610 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f 63  unless the alloc
37620 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65 6e  ated page happen
37630 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73 69  s.    ** to resi
37640 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e  de at pgnoRoot).
37650 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
37660 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
37670 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d 6f  ge(pBt, &pPageMo
37680 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70  ve, &pgnoMove, p
37690 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20  gnoRoot, 1);.   
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 72 65 74 75  OK ){.      retu
376c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
376d0 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d    if( pgnoMove!=
376e0 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20  pgnoRoot ){.    
376f0 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73    /* pgnoRoot is
37700 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 77   the page that w
37710 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72 20  ill be used for 
37720 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  the root-page of
37730 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65  .      ** the ne
37740 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69 6e  w table (assumin
37750 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20 6e  g an error did n
37760 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20 77  ot occur). But w
37770 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a 20  e were.      ** 
37780 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f  allocated pgnoMo
37790 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64 20  ve. If required 
377a0 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73 20  (i.e. if it was 
377b0 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  not allocated.  
377c0 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e 64      ** by extend
377d0 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20 74  ing the file), t
377e0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
377f0 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f  at position pgno
37800 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Move.      ** is
37810 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c   already journal
37820 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
37830 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
37840 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
37850 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ;..      release
37860 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29 3b  Page(pPageMove);
37870 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20  ..      /* Move 
37880 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
37890 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74  ly at pgnoRoot t
378a0 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20  o pgnoMove. */. 
378b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
378c0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
378d0 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52  t, pgnoRoot, &pR
378e0 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  oot, 0);.      i
378f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
37900 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
37910 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
37920 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
37930 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f  Get(pBt, pgnoRoo
37940 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  t, &eType, &iPtr
37950 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
37960 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
37970 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65  OOTPAGE || eType
37980 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
37990 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
379a0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
379b0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
379c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
379d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
379e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
379f0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  oot);.        re
37a00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
37a10 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
37a20 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
37a30 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61  TPAGE );.      a
37a40 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54  ssert( eType!=PT
37a50 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b  RMAP_FREEPAGE );
37a60 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f  .      rc = relo
37a70 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52  catePage(pBt, pR
37a80 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72  oot, eType, iPtr
37a90 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20  Page, pgnoMove, 
37aa0 30 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  0);.      releas
37ab0 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20  ePage(pRoot);.. 
37ac0 20 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74       /* Obtain t
37ad0 68 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52  he page at pgnoR
37ae0 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  oot */.      if(
37af0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37b00 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37b10 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37b20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
37b30 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
37b40 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f   pgnoRoot, &pRoo
37b50 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  t, 0);.      if(
37b60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
37b70 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
37b80 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
37ba0 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d  agerWrite(pRoot-
37bb0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
37bc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
37bd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
37be0 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29  leasePage(pRoot)
37bf0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37c00 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
37c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52   }else{.      pR
37c20 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b  oot = pPageMove;
37c30 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20  .    } ..    /* 
37c40 55 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  Update the point
37c50 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d  er-map and meta-
37c60 64 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65  data with the ne
37c70 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  w root-page numb
37c80 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  er. */.    rc = 
37c90 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
37ca0 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f  gnoRoot, PTRMAP_
37cb0 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20  ROOTPAGE, 0);.  
37cc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37cd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
37ce0 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
37cf0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
37d00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
37d10 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20  eeUpdateMeta(p, 
37d20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  4, pgnoRoot);.  
37d30 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37d40 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52    releasePage(pR
37d50 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  oot);.      retu
37d60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
37d70 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
37d80 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
37d90 65 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26  e(pBt, &pRoot, &
37da0 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b  pgnoRoot, 1, 0);
37db0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37dc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
37dd0 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71  dif.  assert( sq
37de0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
37df0 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62  eable(pRoot->pDb
37e00 50 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50  Page) );.  zeroP
37e10 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73  age(pRoot, flags
37e20 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20   | PTF_LEAF);.  
37e30 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
37e40 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65  f(pRoot->pDbPage
37e50 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20  );.  *piTable = 
37e60 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20  (int)pgnoRoot;. 
37e70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
37e80 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
37e90 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  BtreeCreateTable
37ea0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
37eb0 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
37ec0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
37ed0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
37ee0 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 62 74  er(p);.  rc = bt
37ef0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 70  reeCreateTable(p
37f00 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73  , piTable, flags
37f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37f20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
37f30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37f40 20 45 72 61 73 65 20 74 68 65 20 67 69 76 65 6e   Erase the given
37f50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
37f60 6e 64 20 61 6c 6c 20 69 74 73 20 63 68 69 6c 64  nd all its child
37f70 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ren.  Return.** 
37f80 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
37f90 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  freelist..*/.sta
37fa0 74 69 63 20 69 6e 74 20 63 6c 65 61 72 44 61 74  tic int clearDat
37fb0 61 62 61 73 65 50 61 67 65 28 0a 20 20 42 74 53  abasePage(.  BtS
37fc0 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
37fd0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
37fe0 65 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ee that contains
37ff0 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20   the table */.  
38000 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
38010 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75        /* Page nu
38020 6d 62 65 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f  mber to clear */
38030 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67 65 46  .  int freePageF
38040 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c  lag,     /* Deal
38050 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66 20 74  locate page if t
38060 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rue */.  int *pn
38070 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50  Change.){.  MemP
38080 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
38090 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
380a0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
380b0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
380c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
380d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
380e0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
380f0 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75 6e  no>pagerPagecoun
38100 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65  t(pBt) ){.    re
38110 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
38120 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
38130 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
38140 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
38150 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &pPage);.  if( r
38160 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
38170 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
38180 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
38190 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
381a0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
381b0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
381c0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
381d0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
381e0 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73  c = clearDatabas
381f0 65 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62  ePage(pBt, get4b
38200 79 74 65 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70  yte(pCell), 1, p
38210 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20  nChange);.      
38220 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
38230 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
38240 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
38250 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
38260 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
38270 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
38280 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
38290 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  _out;.  }.  if( 
382a0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
382b0 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
382c0 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
382d0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
382e0 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70  >aData[8]), 1, p
382f0 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 69 66  nChange);.    if
38300 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
38310 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
38320 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  t;.  }else if( p
38330 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20 20 20 61  nChange ){.    a
38340 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
38350 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43  tKey );.    *pnC
38360 68 61 6e 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e  hange += pPage->
38370 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28  nCell;.  }.  if(
38380 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
38390 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
383a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
383b0 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
383c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
383d0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
383e0 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
383f0 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
38400 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
38410 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
38420 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
38430 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
38440 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
38450 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
38460 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
38470 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
38480 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
38490 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
384a0 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 6