/ Hex Artifact Content
Login

Artifact 464fbd75cfa198659088e424d5907aa025768628:


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 35 31 20 32 30 30 39 2f 30  c,v 1.651 2009/0
0190: 37 2f 30 34 20 31 35 3a 34 31 3a 30 33 20 64 61  7/04 15:41:03 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63  builds..**.** Ac
0530: 63 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72  cess to this var
0540: 69 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74  iable is protect
0550: 65 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54  ed by SQLITE_MUT
0560: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
0570: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
0580: 54 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64  TE_TEST.BtShared
0590: 20 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c   *SQLITE_WSD sql
05a0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
05b0: 69 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73  ist = 0;.#else.s
05c0: 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a  tatic BtShared *
05d0: 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74  SQLITE_WSD sqlit
05e0: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
05f0: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  t = 0;.#endif.#e
0600: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0610: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0620: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0630: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0640: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0650: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0660: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0670: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0680: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0690: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
06a0: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06b0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06c0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06d0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06e0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06f0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
0700: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0710: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0720: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0730: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0740: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0750: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0760: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0770: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0780: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0790: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
07a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
07b0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69  ;.}.#endif....#i
07c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
07d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
07e0: 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63  /*.  ** The func
07f0: 74 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65  tions queryShare
0800: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
0810: 29 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68  ), setSharedCach
0820: 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20  eTableLock(),.  
0830: 2a 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53  ** and clearAllS
0840: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0850: 6f 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  ocks().  ** mani
0860: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0870: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0880: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0890: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
08a0: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
08b0: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08c0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08d0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08e0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08f0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
0900: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
0910: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0920: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0930: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0940: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0950: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0960: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0970: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0980: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0990: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
09a0: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
09b0: 23 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61  #define querySha
09c0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
09d0: 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f  k(a,b,c) SQLITE_
09e0: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74  OK.  #define set
09f0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0a00: 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49  Lock(a,b,c) SQLI
0a10: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
0a20: 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
0a30: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29  cheTableLocks(a)
0a40: 0a 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67  .  #define downg
0a50: 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63  radeAllSharedCac
0a60: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0a70: 20 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61    #define hasSha
0a80: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0a90: 6b 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23  k(a,b,c,d) 1.  #
0aa0: 64 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f  define hasReadCo
0ab0: 6e 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a  nflicts(a, b) 0.
0ac0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
0ad0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
0ae0: 45 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66  ED_CACHE..#ifdef
0af0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
0b00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
0b10: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
0b20: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73  s part of an ass
0b30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 2e  ert() statement.
0b40: 20 49 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68   It checks.** th
0b50: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  at connection p 
0b60: 68 6f 6c 64 73 20 74 68 65 20 72 65 71 75 69 72  holds the requir
0b70: 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72 65 61 64  ed locks to read
0b80: 20 6f 72 20 77 72 69 74 65 20 74 6f 20 74 68 65   or write to the
0b90: 20 0a 2a 2a 20 62 2d 74 72 65 65 20 77 69 74 68   .** b-tree with
0ba0: 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f 6f 74   root page iRoot
0bb0: 2e 20 49 66 20 73 6f 2c 20 74 72 75 65 20 69 73  . If so, true is
0bc0: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
0bd0: 77 69 73 65 2c 20 66 61 6c 73 65 2e 20 0a 2a 2a  wise, false. .**
0be0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   For example, wh
0bf0: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 20  en writing to a 
0c00: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 77 69 74  table b-tree wit
0c10: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
0c20: 74 20 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20  t via .** Btree 
0c30: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65  connection pBtre
0c40: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65  e:.**.**    asse
0c50: 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61 63  rt( hasSharedCac
0c60: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72  heTableLock(pBtr
0c70: 65 65 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52  ee, iRoot, 0, WR
0c80: 49 54 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a  ITE_LOCK) );.**.
0c90: 2a 2a 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20  ** When writing 
0ca0: 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  to an index b-tr
0cb0: 65 65 20 74 68 61 74 20 72 65 73 69 64 65 73 20  ee that resides 
0cc0: 69 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61  in a sharable da
0cd0: 74 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20  tabase, the .** 
0ce0: 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61  caller should ha
0cf0: 76 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65  ve first obtaine
0d00: 64 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79  d a lock specify
0d10: 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67  ing the root pag
0d20: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72  e of.** the corr
0d30: 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 20  esponding table 
0d40: 62 2d 74 72 65 65 2e 20 54 68 69 73 20 6d 61 6b  b-tree. This mak
0d50: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
0d60: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
0d70: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
0d80: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
0d90: 62 2d 74 72 65 65 20 61 73 20 61 20 73 65 70 61  b-tree as a sepa
0da0: 72 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20  rate structure. 
0db0: 54 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20  To determine.** 
0dc0: 74 68 65 20 74 61 62 6c 65 20 62 2d 74 72 65 65  the table b-tree
0dd0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
0de0: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72  o the index b-tr
0df0: 65 65 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  ee being written
0e00: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
0e10: 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63 68  on has to search
0e20: 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61 74   through the dat
0e30: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a  abase schema..**
0e40: 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61  .** Instead of a
0e50: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 62 2d 74   lock on the b-t
0e60: 72 65 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ree rooted at pa
0e70: 67 65 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61  ge iRoot, the ca
0e80: 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64  ller may.** hold
0e90: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
0ea0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c   the schema tabl
0eb0: 65 20 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e  e (root page 1).
0ec0: 20 54 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a   This is also.**
0ed0: 20 61 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a   acceptable..*/.
0ee0: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 53 68  static int hasSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  ck(.  Btree *pBt
0f10: 72 65 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ree,         /* 
0f20: 48 61 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74  Handle that must
0f30: 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   hold lock */.  
0f40: 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20  Pgno iRoot,     
0f50: 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
0f60: 61 67 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f  age of b-tree */
0f70: 0a 20 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20  .  int isIndex, 
0f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
0f90: 65 20 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68  e if iRoot is th
0fa0: 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64  e root of an ind
0fb0: 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  ex b-tree */.  i
0fc0: 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20  nt eLockType    
0fd0: 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
0fe0: 64 20 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41  d lock type (REA
0ff0: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
1000: 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63  LOCK) */.){.  Sc
1010: 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20  hema *pSchema = 
1020: 28 53 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65  (Schema *)pBtree
1030: 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a  ->pBt->pSchema;.
1040: 20 20 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b    Pgno iTab = 0;
1050: 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b  .  BtLock *pLock
1060: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1070: 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 20  b-tree database 
1080: 69 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65  is not shareable
1090: 2c 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65  , or if the clie
10a0: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20  nt is reading.  
10b0: 2a 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72  ** and has the r
10c0: 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20  ead-uncommitted 
10d0: 66 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e  flag set, then n
10e0: 6f 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72  o lock is requir
10f0: 65 64 2e 20 0a 20 20 2a 2a 20 49 6e 20 74 68 65  ed. .  ** In the
1100: 73 65 20 63 61 73 65 73 20 72 65 74 75 72 6e 20  se cases return 
1110: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1120: 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  .  If the client
1130: 20 69 73 20 72 65 61 64 69 6e 67 20 0a 20 20 2a   is reading .  *
1140: 2a 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20  * or writing an 
1150: 69 6e 64 65 78 20 62 2d 74 72 65 65 2c 20 62 75  index b-tree, bu
1160: 74 20 74 68 65 20 73 63 68 65 6d 61 20 69 73 20  t the schema is 
1170: 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68 65 6e  not loaded, then
1180: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75   return.  ** tru
1190: 65 20 61 6c 73 6f 2e 20 49 6e 20 74 68 69 73 20  e also. In this 
11a0: 63 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 69 73  case the lock is
11b0: 20 72 65 71 75 69 72 65 64 2c 20 62 75 74 20 69   required, but i
11c0: 74 20 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75  t is too difficu
11d0: 6c 74 0a 20 20 2a 2a 20 74 6f 20 63 68 65 63 6b  lt.  ** to check
11e0: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 61   if the client a
11f0: 63 74 75 61 6c 6c 79 20 68 6f 6c 64 73 20 69 74  ctually holds it
1200: 2e 20 54 68 69 73 20 64 6f 65 73 6e 27 74 20 68  . This doesn't h
1210: 61 70 70 65 6e 20 76 65 72 79 0a 20 20 2a 2a 20  appen very.  ** 
1220: 6f 66 74 65 6e 2e 20 20 2a 2f 0a 20 20 69 66 28  often.  */.  if(
1230: 20 28 70 42 74 72 65 65 2d 3e 73 68 61 72 61 62   (pBtree->sharab
1240: 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 65 4c  le==0).   || (eL
1250: 6f 63 6b 54 79 70 65 3d 3d 52 45 41 44 5f 4c 4f  ockType==READ_LO
1260: 43 4b 20 26 26 20 28 70 42 74 72 65 65 2d 3e 64  CK && (pBtree->d
1270: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1280: 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  E_ReadUncommitte
1290: 64 29 29 0a 20 20 20 7c 7c 20 28 69 73 49 6e 64  d)).   || (isInd
12a0: 65 78 20 26 26 20 28 21 70 53 63 68 65 6d 61 20  ex && (!pSchema 
12b0: 7c 7c 20 28 70 53 63 68 65 6d 61 2d 3e 66 6c 61  || (pSchema->fla
12c0: 67 73 26 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  gs&DB_SchemaLoad
12d0: 65 64 29 3d 3d 30 20 29 29 0a 20 20 29 7b 0a 20  ed)==0 )).  ){. 
12e0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12f0: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
1300: 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  t the root-page 
1310: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68  that the lock sh
1320: 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e  ould be held on.
1330: 20 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20   For table.  ** 
1340: 62 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73  b-trees, this is
1350: 20 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70   just the root p
1360: 61 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65  age of the b-tre
1370: 65 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a  e being read or.
1380: 20 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f    ** written. Fo
1390: 72 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c  r index b-trees,
13a0: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
13b0: 70 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f  page of the asso
13c0: 63 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c  ciated.  ** tabl
13d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49  e.  */.  if( isI
13e0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68  ndex ){.    Hash
13f0: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72  Elem *p;.    for
1400: 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (p=sqliteHashFir
1410: 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78  st(&pSchema->idx
1420: 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69  Hash); p; p=sqli
1430: 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a  teHashNext(p)){.
1440: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
1450: 78 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c  x = (Index *)sql
1460: 69 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a  iteHashData(p);.
1470: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
1480: 74 6e 75 6d 3d 3d 69 52 6f 6f 74 20 29 7b 0a 09  tnum==iRoot ){..
1490: 69 54 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61  iTab = pIdx->pTa
14a0: 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  ble->tnum;.     
14b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
14c0: 7b 0a 20 20 20 20 69 54 61 62 20 3d 20 69 52 6f  {.    iTab = iRo
14d0: 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ot;.  }..  /* Se
14e0: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 65 71  arch for the req
14f0: 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68  uired lock. Eith
1500: 65 72 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  er a write-lock 
1510: 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  on root-page iTa
1520: 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72 69 74 65  b, a .  ** write
1530: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68  -lock on the sch
1540: 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72 20 28 69  ema table, or (i
1550: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
1560: 72 65 61 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20  reading) a.  ** 
1570: 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61  read-lock on iTa
1580: 62 20 77 69 6c 6c 20 73 75 66 66 69 63 65 2e 20  b will suffice. 
1590: 52 65 74 75 72 6e 20 31 20 69 66 20 61 6e 79 20  Return 1 if any 
15a0: 6f 66 20 74 68 65 73 65 20 61 72 65 20 66 6f 75  of these are fou
15b0: 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c  nd.  */.  for(pL
15c0: 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d  ock=pBtree->pBt-
15d0: 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70  >pLock; pLock; p
15e0: 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78  Lock=pLock->pNex
15f0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63  t){.    if( pLoc
1600: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42 74 72 65  k->pBtree==pBtre
1610: 65 20 0a 20 20 20 20 20 26 26 20 28 70 4c 6f 63  e .     && (pLoc
1620: 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20  k->iTable==iTab 
1630: 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  || (pLock->eLock
1640: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20  ==WRITE_LOCK && 
1650: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31  pLock->iTable==1
1660: 29 29 0a 20 20 20 20 20 26 26 20 70 4c 6f 63 6b  )).     && pLock
1670: 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79  ->eLock>=eLockTy
1680: 70 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  pe .    ){.     
1690: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
16a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65  .  }..  /* Faile
16b0: 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 72 65  d to find the re
16c0: 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  quired lock. */.
16d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
16e0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
16f0: 6f 6e 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20  on is also used 
1700: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1710: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 6f  t() statements o
1720: 6e 6c 79 2e 20 49 74 20 0a 2a 2a 20 72 65 74 75  nly. It .** retu
1730: 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 72  rns true if ther
1740: 65 20 65 78 69 73 74 20 6f 6e 65 20 6f 72 20 6d  e exist one or m
1750: 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  ore cursors open
1760: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   on the table .*
1770: 2a 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67 65  * with root page
1780: 20 69 52 6f 6f 74 20 74 68 61 74 20 64 6f 20 6e   iRoot that do n
1790: 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20 65 69 74  ot belong to eit
17a0: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  her connection p
17b0: 42 74 72 65 65 20 0a 2a 2a 20 6f 72 20 73 6f 6d  Btree .** or som
17c0: 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
17d0: 6f 6e 20 74 68 61 74 20 68 61 73 20 74 68 65 20  on that has the 
17e0: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
17f0: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
1800: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65   For example, be
1810: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
1820: 70 61 67 65 20 69 52 6f 6f 74 3a 0a 2a 2a 0a 2a  page iRoot:.**.*
1830: 2a 20 20 20 20 61 73 73 65 72 74 28 20 21 68 61  *    assert( !ha
1840: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
1850: 42 74 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b  Btree, iRoot) );
1860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
1870: 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
1880: 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50  Btree *pBtree, P
1890: 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74  gno iRoot){.  Bt
18a0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72  Cursor *p;.  for
18b0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
18c0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
18d0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
18e0: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52   p->pgnoRoot==iR
18f0: 6f 6f 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e  oot .     && p->
1900: 70 42 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20  pBtree!=pBtree. 
1910: 20 20 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42      && 0==(p->pB
1920: 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  tree->db->flags 
1930: 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  & SQLITE_ReadUnc
1940: 6f 6d 6d 69 74 74 65 64 29 0a 20 20 20 20 29 7b  ommitted).    ){
1950: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1970: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1980: 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53 51 4c     /* #ifdef SQL
1990: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  ITE_DEBUG */../*
19a0: 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65  .** Query to see
19b0: 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65   if btree handle
19c0: 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20   p may obtain a 
19d0: 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f  lock of type eLo
19e0: 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43  ck .** (READ_LOC
19f0: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
1a00: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1a10: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1a20: 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  b. Return.** SQL
1a30: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f  ITE_OK if the lo
1a40: 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ck may be obtain
1a50: 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a  ed (by calling.*
1a60: 2a 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  * setSharedCache
1a70: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72  TableLock()), or
1a80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
1a90: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
1aa0: 20 69 6e 74 20 71 75 65 72 79 53 68 61 72 65 64   int queryShared
1ab0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
1ac0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
1ad0: 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  ab, u8 eLock){. 
1ae0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1af0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
1b00: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
1b10: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
1b20: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
1b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
1b40: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
1b50: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1b60: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
1b70: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ->db!=0 );.  ass
1b80: 65 72 74 28 20 21 28 70 2d 3e 64 62 2d 3e 66 6c  ert( !(p->db->fl
1b90: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
1ba0: 6e 63 6f 6d 6d 69 74 74 65 64 29 7c 7c 65 4c 6f  ncommitted)||eLo
1bb0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c  ck==WRITE_LOCK||
1bc0: 69 54 61 62 3d 3d 31 20 29 3b 0a 20 20 0a 20 20  iTab==1 );.  .  
1bd0: 2f 2a 20 49 66 20 72 65 71 75 65 73 74 69 6e 67  /* If requesting
1be0: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2c 20 74   a write-lock, t
1bf0: 68 65 6e 20 74 68 65 20 42 74 72 65 65 20 6d 75  hen the Btree mu
1c00: 73 74 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  st have an open 
1c10: 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e 73  write.  ** trans
1c20: 61 63 74 69 6f 6e 20 6f 6e 20 74 68 69 73 20 66  action on this f
1c30: 69 6c 65 2e 20 41 6e 64 2c 20 6f 62 76 69 6f 75  ile. And, obviou
1c40: 73 6c 79 2c 20 66 6f 72 20 74 68 69 73 20 74 6f  sly, for this to
1c50: 20 62 65 20 73 6f 20 74 68 65 72 65 20 0a 20 20   be so there .  
1c60: 2a 2a 20 6d 75 73 74 20 62 65 20 61 6e 20 6f 70  ** must be an op
1c70: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
1c80: 74 69 6f 6e 20 6f 6e 20 74 68 65 20 66 69 6c 65  tion on the file
1c90: 20 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20   itself..  */.  
1ca0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
1cb0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d  EAD_LOCK || (p==
1cc0: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 26 26 20  pBt->pWriter && 
1cd0: 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
1ce0: 53 5f 57 52 49 54 45 29 20 29 3b 0a 20 20 61 73  S_WRITE) );.  as
1cf0: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1d00: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42 74 2d 3e 69  D_LOCK || pBt->i
1d10: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1d20: 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 0a  ANS_WRITE );.  .
1d30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1d40: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1d50: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1d60: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1d70: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
1d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d90: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
1da0: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
1db0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
1dc0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
1dd0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
1de0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
1df0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
1e00: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
1e10: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
1e20: 26 26 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73  && pBt->isExclus
1e30: 69 76 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ive ){.    sqlit
1e40: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1e50: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e  ked(p->db, pBt->
1e60: 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20  pWriter->db);.  
1e70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e80: 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43  LOCKED_SHAREDCAC
1e90: 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70  HE;.  }..  for(p
1ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
1eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
1ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
1ed0: 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
1ee0: 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21  n (pIter->eLock!
1ef0: 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66  =eLock) in the f
1f00: 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29  ollowing if(...)
1f10: 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1f20: 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69  nt is a simplifi
1f30: 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a  cation of:.    *
1f40: 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63  *.    **   (eLoc
1f50: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c  k==WRITE_LOCK ||
1f60: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57   pIter->eLock==W
1f70: 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a  RITE_LOCK).    *
1f80: 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77  *.    ** since w
1f90: 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65  e know that if e
1fa0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
1fb0: 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20  , then no other 
1fc0: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a  connection.    *
1fd0: 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49  * may hold a WRI
1fe0: 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74  TE_LOCK on any t
1ff0: 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c  able in this fil
2000: 65 20 28 73 69 6e 63 65 20 74 68 65 72 65 20 63  e (since there c
2010: 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62  an.    ** only b
2020: 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65  e a single write
2030: 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  r)..    */.    a
2040: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c  ssert( pIter->eL
2050: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2060: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
2070: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2080: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2090: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  =READ_LOCK || pI
20a0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c  ter->pBtree==p |
20b0: 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d  | pIter->eLock==
20c0: 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  READ_LOCK);.    
20d0: 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
20e0: 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69  e!=p && pIter->i
20f0: 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70  Table==iTab && p
2100: 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f  Iter->eLock!=eLo
2110: 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ck ){.      sqli
2120: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f  te3ConnectionBlo
2130: 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65  cked(p->db, pIte
2140: 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a  r->pBtree->db);.
2150: 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d        if( eLock=
2160: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20  =WRITE_LOCK ){. 
2170: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2180: 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29  ==pBt->pWriter )
2190: 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69  ;.        pBt->i
21a0: 73 50 65 6e 64 69 6e 67 20 3d 20 31 3b 0a 20 20  sPending = 1;.  
21b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
21c0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
21d0: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
21e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
21f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2250: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
2260: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
2270: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
2280: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
2290: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
22a0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
22b0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
22c0: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
22d0: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
22e0: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  LOCK..**.** SQLI
22f0: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
2300: 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  d if the lock is
2310: 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
2320: 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53 59  lly. SQLITE_BUSY
2330: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e   and.** SQLITE_N
2340: 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62 65  OMEM may also be
2350: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2360: 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61 72  atic int setShar
2370: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2380: 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20  (Btree *p, Pgno 
2390: 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b  iTable, u8 eLock
23a0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
23b0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
23c0: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30  tLock *pLock = 0
23d0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
23e0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
23f0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2400: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2410: 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44  ert( eLock==READ
2420: 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d  _LOCK || eLock==
2430: 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  WRITE_LOCK );.  
2440: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d 30  assert( p->db!=0
2450: 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e   );..  /* A conn
2460: 65 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  ection with the 
2470: 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64  read-uncommitted
2480: 20 66 6c 61 67 20 73 65 74 20 77 69 6c 6c 20 6e   flag set will n
2490: 65 76 65 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a  ever try to.  **
24a0: 20 6f 62 74 61 69 6e 20 61 20 72 65 61 64 2d 6c   obtain a read-l
24b0: 6f 63 6b 20 75 73 69 6e 67 20 74 68 69 73 20 66  ock using this f
24c0: 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c  unction. The onl
24d0: 79 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61  y read-lock obta
24e0: 69 6e 65 64 0a 20 20 2a 2a 20 62 79 20 61 20 63  ined.  ** by a c
24f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 72 65 61  onnection in rea
2500: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f  d-uncommitted mo
2510: 64 65 20 69 73 20 6f 6e 20 74 68 65 20 73 71 6c  de is on the sql
2520: 69 74 65 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a  ite_master .  **
2530: 20 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 61 74   table, and that
2540: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
2550: 64 20 69 6e 20 42 74 72 65 65 42 65 67 69 6e 54  d in BtreeBeginT
2560: 72 61 6e 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73  rans().  */.  as
2570: 73 65 72 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d  sert( 0==(p->db-
2580: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52 65  >flags&SQLITE_Re
2590: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c  adUncommitted) |
25a0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
25b0: 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  OCK );..  /* Thi
25c0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
25d0: 74 68 65 20 73 68 61 72 65 64 2d 63 61 63 68 65  the shared-cache
25e0: 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20   is not enabled 
25f0: 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  */.  if( !p->sha
2600: 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74  rable ){.    ret
2610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2620: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51   }..  assert( SQ
2630: 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68  LITE_OK==querySh
2640: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
2650: 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c  ck(p, iTable, eL
2660: 6f 63 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  ock) );..  /* Fi
2670: 72 73 74 20 73 65 61 72 63 68 20 74 68 65 20 6c  rst search the l
2680: 69 73 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ist for an exist
2690: 69 6e 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73  ing lock on this
26a0: 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72   table. */.  for
26b0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
26c0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
26d0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
26e0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
26f0: 61 62 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20  able==iTable && 
2700: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2710: 20 29 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20   ){.      pLock 
2720: 3d 20 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62  = pIter;.      b
2730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2740: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f  .  /* If the abo
2750: 76 65 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f  ve search did no
2760: 74 20 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20  t find a BtLock 
2770: 73 74 72 75 63 74 20 61 73 73 6f 63 69 61 74 69  struct associati
2780: 6e 67 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20  ng Btree p.  ** 
2790: 77 69 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c  with table iTabl
27a0: 65 2c 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20  e, allocate one 
27b0: 61 6e 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f  and link it into
27c0: 20 74 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a   the list..  */.
27d0: 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a    if( !pLock ){.
27e0: 20 20 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c      pLock = (BtL
27f0: 6f 63 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  ock *)sqlite3Mal
2800: 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42  locZero(sizeof(B
2810: 74 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28  tLock));.    if(
2820: 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   !pLock ){.     
2830: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2840: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2850: 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20  pLock->iTable = 
2860: 69 54 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63  iTable;.    pLoc
2870: 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  k->pBtree = p;. 
2880: 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20     pLock->pNext 
2890: 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
28a0: 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70    pBt->pLock = p
28b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Lock;.  }..  /* 
28c0: 53 65 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65  Set the BtLock.e
28d0: 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f  Lock variable to
28e0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20   the maximum of 
28f0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
2900: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
2910: 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68  quested lock. Th
2920: 69 73 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72  is means if a wr
2930: 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72  ite-lock was alr
2940: 65 61 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61  eady held.  ** a
2950: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72  nd a read-lock r
2960: 65 71 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e  equested, we don
2970: 27 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64  't incorrectly d
2980: 6f 77 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63  owngrade the loc
2990: 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  k..  */.  assert
29a0: 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41  ( WRITE_LOCK>REA
29b0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
29c0: 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f  eLock>pLock->eLo
29d0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d  ck ){.    pLock-
29e0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
29f0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2a00: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
2a10: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
2a20: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a  T_SHARED_CACHE *
2a30: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
2a40: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
2a50: 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  CHE./*.** Releas
2a60: 65 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20  e all the table 
2a70: 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74  locks (locks obt
2a80: 61 69 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20  ained via calls 
2a90: 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61  to.** the setSha
2aa0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
2ab0: 6b 28 29 20 70 72 6f 63 65 64 75 72 65 29 20 68  k() procedure) h
2ac0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
2ad0: 64 6c 65 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  dle p..**.** Thi
2ae0: 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
2af0: 65 73 20 74 68 61 74 20 68 61 6e 64 6c 65 20 70  es that handle p
2b00: 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72 65 61   has an open rea
2b10: 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a 20 74  d or write .** t
2b20: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 69  ransaction. If i
2b30: 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e  t does not, then
2b40: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 69 73   the BtShared.is
2b50: 50 65 6e 64 69 6e 67 20 76 61 72 69 61 62 6c 65  Pending variable
2b60: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
2b70: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
2b80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2b90: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
2ba0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
2bb0: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
2bc0: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2bd0: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
2be0: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
2bf0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
2c00: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2c10: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
2c20: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
2c30: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
2c40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
2c50: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
2c60: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
2c70: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
2c80: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
2c90: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
2ca0: 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2cb0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
2cc0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a  Lock->pBtree );.
2cd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
2ce0: 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61  k->pBtree->inTra
2cf0: 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ns>=pLock->eLock
2d00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63   );.    if( pLoc
2d10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  k->pBtree==p ){.
2d20: 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20        *ppIter = 
2d30: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
2d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
2d50: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20  k->iTable!=1 || 
2d60: 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20  pLock==&p->lock 
2d70: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f  );.      if( pLo
2d80: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b  ck->iTable!=1 ){
2d90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2da0: 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20  _free(pLock);.  
2db0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2dc0: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
2dd0: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
2de0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
2df0: 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e 64 69  rt( pBt->isPendi
2e00: 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  ng==0 || pBt->pW
2e10: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
2e20: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
2e30: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
2e40: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
2e50: 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30  >isExclusive = 0
2e60: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e  ;.    pBt->isPen
2e70: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ding = 0;.  }els
2e80: 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e  e if( pBt->nTran
2e90: 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20  saction==2 ){.  
2ea0: 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
2eb0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
2ec0: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 69  n connection p i
2ed0: 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74 73  s concluding its
2ee0: 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63   .    ** transac
2ef0: 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20 63  tion. If there c
2f00: 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 20  urrently exists 
2f10: 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70 20  a writer, and p 
2f20: 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74 68  is not.    ** th
2f30: 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20  at writer, then 
2f40: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 6f  the number of lo
2f50: 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
2f60: 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20 20  ections other.  
2f70: 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77 72    ** than the wr
2f80: 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62 6f  iter must be abo
2f90: 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a 65  ut to drop to ze
2fa0: 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ro. In this case
2fb0: 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20  .    ** set the 
2fc0: 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67 20 74  isPending flag t
2fd0: 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  o 0..    **.    
2fe0: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
2ff0: 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77  ot currently a w
3000: 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74 53 68  riter, then BtSh
3010: 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67 20 6d  ared.isPending m
3020: 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65  ust.    ** be ze
3030: 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74  ro already. So t
3040: 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73  his next line is
3050: 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61   harmless in tha
3060: 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  t case..    */. 
3070: 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69 6e     pBt->isPendin
3080: 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  g = 0;.  }.}../*
3090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
30a0: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
30b0: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
30c0: 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 74  y connection p t
30d0: 6f 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f  o read-locks..*/
30e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77  .static void dow
30f0: 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43  ngradeAllSharedC
3100: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3110: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
3120: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
3130: 42 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  Bt;.  if( pBt->p
3140: 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20  Writer==p ){.   
3150: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
3160: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3170: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69   = 0;.    pBt->i
3180: 73 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a  sExclusive = 0;.
3190: 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64 69      pBt->isPendi
31a0: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ng = 0;.    for(
31b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
31c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
31d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
31e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
31f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3200: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3210: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3220: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3230: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3240: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3250: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3260: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3270: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3280: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3290: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
32a0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
32b0: 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  ../*.** Verify t
32c0: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
32d0: 6f 6c 64 73 20 61 20 6d 75 74 65 78 20 6f 6e 20  olds a mutex on 
32e0: 74 68 65 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a  the BtShared.*/.
32f0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
3300: 74 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72  tatic int cursor
3310: 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43 75 72  HoldsMutex(BtCur
3320: 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  sor *p){.  retur
3330: 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  n sqlite3_mutex_
3340: 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74  held(p->pBt->mut
3350: 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  ex);.}.#endif...
3360: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3370: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a  MIT_INCRBLOB./*.
3380: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3390: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
33a0: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 63  list cache for c
33b0: 75 72 73 6f 72 20 70 43 75 72 2c 20 69 66 20 61  ursor pCur, if a
33c0: 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ny..*/.static vo
33d0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65  id invalidateOve
33e0: 72 66 6c 6f 77 43 61 63 68 65 28 42 74 43 75 72  rflowCache(BtCur
33f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
3400: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
3410: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
3420: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3430: 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
3440: 0a 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  .  pCur->aOverfl
3450: 6f 77 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ow = 0;.}../*.**
3460: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3470: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
3480: 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c  st cache for all
3490: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
34a0: 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  ** on the shared
34b0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
34c0: 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pBt..*/.static 
34d0: 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41  void invalidateA
34e0: 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
34f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
3500: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
3510: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
3520: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
3530: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72  >mutex) );.  for
3540: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
3550: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3560: 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  .    invalidateO
3570: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b  verflowCache(p);
3580: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3590: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
35a0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
35b0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
35c0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
35d0: 2a 20 62 2d 74 72 65 65 20 74 6f 20 69 6e 76 61  * b-tree to inva
35e0: 6c 69 64 61 74 65 20 61 6e 79 20 69 6e 63 72 62  lidate any incrb
35f0: 6c 6f 62 20 63 75 72 73 6f 72 73 20 74 68 61 74  lob cursors that
3600: 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65   are open on the
3610: 0a 2a 2a 20 72 6f 77 20 6f 72 20 6f 6e 65 20 6f  .** row or one o
3620: 66 20 74 68 65 20 72 6f 77 73 20 62 65 69 6e 67  f the rows being
3630: 20 6d 6f 64 69 66 69 65 64 2e 20 41 72 67 75 6d   modified. Argum
3640: 65 6e 74 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20  ent pgnoRoot is 
3650: 74 68 65 20 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67  the .** root-pag
3660: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 62  e of the table b
3670: 2d 74 72 65 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  -tree. .**.** If
3680: 20 61 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61   argument isClea
3690: 72 54 61 62 6c 65 20 69 73 20 74 72 75 65 2c 20  rTable is true, 
36a0: 74 68 65 6e 20 74 68 65 20 65 6e 74 69 72 65 20  then the entire 
36b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
36c0: 2a 2a 20 74 61 62 6c 65 20 69 73 20 61 62 6f 75  ** table is abou
36d0: 74 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 2e  t to be deleted.
36e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
36f0: 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 69 6e 63  validate all inc
3700: 72 62 6c 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73  rblob.** cursors
3710: 20 6f 70 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77   open on any row
3720: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3730: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
3740: 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a   pgnoRoot..**.**
3750: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
3760: 72 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54  rgument isClearT
3770: 61 62 6c 65 20 69 73 20 66 61 6c 73 65 2c 20 74  able is false, t
3780: 68 65 6e 20 74 68 65 20 72 6f 77 20 77 69 74 68  hen the row with
3790: 0a 2a 2a 20 72 6f 77 69 64 20 69 52 6f 77 20 69  .** rowid iRow i
37a0: 73 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  s being replaced
37b0: 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   or deleted. In 
37c0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
37d0: 64 61 74 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f  date.** only tho
37e0: 73 65 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  se incrblob curs
37f0: 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
3800: 20 73 70 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a   specific row..*
3810: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
3820: 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62  validateIncrblob
3830: 43 75 72 73 6f 72 73 28 0a 20 20 42 74 72 65 65  Cursors(.  Btree
3840: 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20 20   *pBtree,       
3850: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
3860: 73 65 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  se file to check
3870: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52   */.  Pgno pgnoR
3880: 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  oot,          /*
3890: 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61 64 20 63   Look for read c
38a0: 75 72 73 6f 72 73 20 6f 6e 20 74 68 69 73 20 62  ursors on this b
38b0: 74 72 65 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  tree */.  i64 iR
38c0: 6f 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ow,             
38d0: 20 20 2f 2a 20 54 68 65 20 72 6f 77 69 64 20 74    /* The rowid t
38e0: 68 61 74 20 6d 69 67 68 74 20 62 65 20 63 68 61  hat might be cha
38f0: 6e 67 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  nging */.  int i
3900: 73 43 6c 65 61 72 54 61 62 6c 65 20 20 20 20 20  sClearTable     
3910: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6c     /* True if al
3920: 6c 20 72 6f 77 73 20 61 72 65 20 62 65 69 6e 67  l rows are being
3930: 20 64 65 6c 65 74 65 64 20 2a 2f 0a 29 7b 0a 20   deleted */.){. 
3940: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
3950: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3960: 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 61  pBtree->pBt;.  a
3970: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
3980: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
3990: 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
39a0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
39b0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
39c0: 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72     if( p->isIncr
39d0: 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 69  blobHandle && (i
39e0: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
39f0: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
3a00: 77 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  w) ){.      p->e
3a10: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
3a20: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 20 20  NVALID;.    }.  
3a30: 7d 0a 7d 0a 0a 23 65 6c 73 65 0a 20 20 23 64 65  }.}..#else.  #de
3a40: 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f  fine invalidateO
3a50: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a  verflowCache(x).
3a60: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
3a70: 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
3a80: 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69 6e  ache(x).  #defin
3a90: 65 20 69 6e 76 61 6c 69 64 61 74 65 49 6e 63 72  e invalidateIncr
3aa0: 62 6c 6f 62 43 75 72 73 6f 72 73 28 77 2c 78 2c  blobCursors(w,x,
3ab0: 79 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y,z).#endif../*.
3ac0: 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f 20  ** Set bit pgno 
3ad0: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  of the BtShared.
3ae0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76  pHasContent bitv
3af0: 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  ec. This is call
3b00: 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70 61  ed .** when a pa
3b10: 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75 73  ge that previous
3b20: 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61 74  ly contained dat
3b30: 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65 65  a becomes a free
3b40: 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20 70  -list leaf .** p
3b50: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  age..**.** The B
3b60: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
3b70: 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73 74  ent bitvec exist
3b80: 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  s to work around
3b90: 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20 62   an obscure.** b
3ba0: 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68 65  ug caused by the
3bb0: 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66 20   interaction of 
3bc0: 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f 70  two useful IO op
3bd0: 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72 72  timizations surr
3be0: 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65 2d  ounding.** free-
3bf0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 3a  list leaf pages:
3c00: 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
3c10: 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65 6c   all data is del
3c20: 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67 65  eted from a page
3c30: 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62 65   and the page be
3c40: 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61 20  comes.**      a 
3c50: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
3c60: 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69 73  age, the page is
3c70: 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f 20   not written to 
3c80: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
3c90: 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c 69       (as free-li
3ca0: 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f  st leaf pages co
3cb0: 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67  ntain no meaning
3cc0: 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65 74  ful data). Somet
3cd0: 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75 63  imes.**      suc
3ce0: 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74 20  h a page is not 
3cf0: 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  even journalled 
3d00: 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20  (as it will not 
3d10: 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20  be modified,.** 
3d20: 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72 20       why bother 
3d30: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f 29  journalling it?)
3d40: 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
3d50: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
3d60: 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73 65  af page is reuse
3d70: 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20 69  d, its content i
3d80: 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20 20  s not read.**   
3d90: 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61     from the data
3da0: 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e 20  base or written 
3db0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
3dc0: 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64 20  ile (why should 
3dd0: 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20 69  it.**      be, i
3de0: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20 61  f it is not at a
3df0: 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29 2e  ll meaningful?).
3e00: 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73 65  .**.** By themse
3e10: 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74 69  lves, these opti
3e20: 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20 66  mizations work f
3e30: 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65 20  ine and provide 
3e40: 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66 6f  a handy.** perfo
3e50: 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f 20  rmance boost to 
3e60: 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20 69  bulk delete or i
3e70: 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e 73  nsert operations
3e80: 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a 2a  . However, if.**
3e90: 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64   a page is moved
3ea0: 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
3eb0: 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  t and then reuse
3ec0: 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  d within the sam
3ed0: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
3ee0: 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d 65  , a problem come
3ef0: 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61 67  s up. If the pag
3f00: 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c  e is not journal
3f10: 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20 69  led when.** it i
3f20: 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66  s moved to the f
3f30: 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74 20  ree-list and it 
3f40: 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72  is also not jour
3f50: 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a 2a  nalled when it.*
3f60: 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  * is extracted f
3f70: 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73  rom the free-lis
3f80: 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74 68  t and reused, th
3f90: 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  en the original 
3fa0: 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20 6c  data.** may be l
3fb0: 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65 6e  ost. In the even
3fc0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2c  t of a rollback,
3fd0: 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 70   it may not be p
3fe0: 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72 65  ossible.** to re
3ff0: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
4000: 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  se to its origin
4010: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
4020: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c 75  ..**.** The solu
4030: 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53 68  tion is the BtSh
4040: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4050: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4060: 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a 20  r a page is .** 
4070: 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65 20  moved to become 
4080: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
4090: 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72 65   page, the corre
40a0: 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 0a  sponding bit is.
40b0: 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62 69  ** set in the bi
40c0: 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61  tvec. Whenever a
40d0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65 78   leaf page is ex
40e0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
40f0: 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f   free-list,.** o
4100: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61 62  ptimization 2 ab
4110: 6f 76 65 20 69 73 20 6f 6d 6d 69 74 74 65 64 20  ove is ommitted 
4120: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
4130: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
4140: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
4150: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
4160: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
4170: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4180: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4190: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
41a0: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
41b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
41c0: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
41d0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
41e0: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
41f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4200: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4210: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4220: 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 72  int nPage;.    r
4230: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
4240: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
4250: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
4260: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4270: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
4280: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4290: 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
42a0: 72 65 61 74 65 28 28 75 33 32 29 6e 50 61 67 65  reate((u32)nPage
42b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 42  );.      if( !pB
42c0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29  t->pHasContent )
42d0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
42e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
42f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
4300: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
4310: 4f 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69  OK && pgno<=sqli
4320: 74 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42  te3BitvecSize(pB
4330: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20  t->pHasContent) 
4340: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
4350: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74  te3BitvecSet(pBt
4360: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70  ->pHasContent, p
4370: 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
4380: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4390: 51 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72  Query the BtShar
43a0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76  ed.pHasContent v
43b0: 65 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ector..**.** Thi
43c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
43d0: 6c 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65  lled when a free
43e0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20  -list leaf page 
43f0: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
4400: 74 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  the.** free-list
4410: 20 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72   for reuse. It r
4420: 65 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20  eturns false if 
4430: 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  it is safe to re
4440: 74 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61  trieve the.** pa
4450: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
4460: 72 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65  r layer with the
4470: 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c   'no-content' fl
4480: 61 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68  ag set. True oth
4490: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
44a0: 63 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61  c int btreeGetHa
44b0: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
44c0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
44d0: 6f 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20  o){.  Bitvec *p 
44e0: 3d 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  = pBt->pHasConte
44f0: 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20  nt;.  return (p 
4500: 26 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33  && (pgno>sqlite3
4510: 42 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c  BitvecSize(p) ||
4520: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
4530: 73 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d  st(p, pgno)));.}
4540: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64  ../*.** Clear (d
4550: 65 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68  estroy) the BtSh
4560: 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74  ared.pHasContent
4570: 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68   bitvec. This sh
4580: 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b  ould be.** invok
4590: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
45a0: 73 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69  sion of each wri
45b0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  te-transaction..
45c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
45d0: 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
45e0: 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ent(BtShared *pB
45f0: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74  t){.  sqlite3Bit
4600: 76 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e  vecDestroy(pBt->
4610: 70 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  pHasContent);.  
4620: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4630: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   = 0;.}../*.** S
4640: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
4650: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
4660: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
4670: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
4680: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
4690: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
46a0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
46b0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
46c0: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
46d0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
46e0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
46f0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
4700: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
4710: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
4720: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
4730: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
4740: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
4750: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
4760: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63  x(pCur) );..  rc
4770: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
4780: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
4790: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
47a0: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
47b0: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
47c0: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
47d0: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
47e0: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
47f0: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
4800: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
4810: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
4820: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
4830: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
4840: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
4850: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
4860: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
4870: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
4880: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
4890: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
48a0: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
48b0: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
48c0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
48d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
48e0: 30 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  0==pCur->apPage[
48f0: 30 5d 2d 3e 69 6e 74 4b 65 79 29 7b 0a 20 20 20  0]->intKey){.   
4900: 20 76 6f 69 64 20 2a 70 4b 65 79 20 3d 20 73 71   void *pKey = sq
4910: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28 69 6e  lite3Malloc( (in
4920: 74 29 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a  t)pCur->nKey );.
4930: 20 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a      if( pKey ){.
4940: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4950: 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c  e3BtreeKey(pCur,
4960: 20 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e   0, (int)pCur->n
4970: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
4980: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4990: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
49a0: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
49b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
49c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
49d0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
49e0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
49f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a00: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
4a10: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
4a20: 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
4a30: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
4a40: 65 79 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ey );..  if( rc=
4a50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4a60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
4a70: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4a80: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4a90: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
4aa0: 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
4ab0: 20 20 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61        pCur->apPa
4ac0: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
4ad0: 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
4ae0: 20 3d 20 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d   = -1;.    pCur-
4af0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
4b00: 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20  _REQUIRESEEK;.  
4b10: 7d 0a 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 4f  }..  invalidateO
4b20: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43 75  verflowCache(pCu
4b30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
4b40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74  .}../*.** Save t
4b50: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20  he positions of 
4b60: 61 6c 6c 20 63 75 72 73 6f 72 73 20 65 78 63 65  all cursors exce
4b70: 70 74 20 70 45 78 63 65 70 74 20 6f 70 65 6e 20  pt pExcept open 
4b80: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  on the table .**
4b90: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
4ba0: 69 52 6f 6f 74 2e 20 55 73 75 61 6c 6c 79 2c 20  iRoot. Usually, 
4bb0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6a  this is called j
4bc0: 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f  ust before curso
4bd0: 72 0a 2a 2a 20 70 45 78 63 65 70 74 20 69 73 20  r.** pExcept is 
4be0: 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74  used to modify t
4bf0: 68 65 20 74 61 62 6c 65 20 28 42 74 72 65 65 44  he table (BtreeD
4c00: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
4c10: 49 6e 73 65 72 74 28 29 29 2e 0a 2a 2f 0a 73 74  Insert())..*/.st
4c20: 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c  atic int saveAll
4c30: 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
4c40: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f   *pBt, Pgno iRoo
4c50: 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  t, BtCursor *pEx
4c60: 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  cept){.  BtCurso
4c70: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
4c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4c90: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
4ca0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 63  ;.  assert( pExc
4cb0: 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70  ept==0 || pExcep
4cc0: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
4cd0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
4ce0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
4cf0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d  xt){.    if( p!=
4d00: 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69  pExcept && (0==i
4d10: 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52  Root || p->pgnoR
4d20: 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 26 26 20 0a  oot==iRoot) && .
4d30: 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74          p->eStat
4d40: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
4d50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
4d60: 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
4d70: 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 69  tion(p);.      i
4d80: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
4d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
4da0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
4db0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4dc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4dd0: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
4de0: 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
4df0: 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  osition..*/.void
4e00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
4e10: 61 72 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  arCursor(BtCurso
4e20: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
4e30: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
4e40: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
4e50: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
4e60: 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72  r->pKey);.  pCur
4e70: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43  ->pKey = 0;.  pC
4e80: 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
4e90: 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a  SOR_INVALID;.}..
4ea0: 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68  /*.** Restore th
4eb0: 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
4ec0: 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20  position it was 
4ed0: 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20  in (or as close 
4ee0: 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a  to as possible).
4ef0: 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73  ** when saveCurs
4f00: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73  orPosition() was
4f10: 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68   called. Note th
4f20: 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c  at this call del
4f30: 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76  etes the .** sav
4f40: 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f  ed position info
4f50: 20 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43   stored by saveC
4f60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c  ursorPosition(),
4f70: 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65   so there can be
4f80: 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  .** at most one 
4f90: 65 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72  effective restor
4fa0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
4fb0: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
4fc0: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
4fd0: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69  Position()..*/.i
4fe0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
4ff0: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5000: 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70  tion(BtCursor *p
5010: 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
5020: 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
5030: 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
5040: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
5050: 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
5060: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
5070: 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
5080: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
5090: 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
50a0: 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
50b0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
50c0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
50d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
50e0: 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
50f0: 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43  , pCur->pKey, pC
5100: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
5110: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
5120: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5130: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
5140: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
5150: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
5160: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
5170: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
5180: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
5190: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
51a0: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
51b0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
51c0: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
51d0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
51e0: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
51f0: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
5200: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
5210: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
5220: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
5230: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
5240: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
5250: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
5260: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
5270: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
5280: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
5290: 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c  tion it.** was l
52a0: 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20  ast placed at.  
52b0: 43 75 72 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65  Cursors can move
52c0: 20 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68   when the row th
52d0: 65 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a  ey are pointing.
52e0: 2a 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65 64  ** at is deleted
52f0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
5300: 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  them..**.** This
5310: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
5320: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
5330: 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  f something goes
5340: 20 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20   wrong.  The.** 
5350: 69 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76  integer *pHasMov
5360: 65 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  ed is set to one
5370: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
5380: 61 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69  as moved and 0 i
5390: 66 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  f not..*/.int sq
53a0: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
53b0: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
53c0: 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48  r *pCur, int *pH
53d0: 61 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  asMoved){.  int 
53e0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74  rc;..  rc = rest
53f0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
5400: 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
5410: 63 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f  c ){.    *pHasMo
5420: 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  ved = 1;.    ret
5430: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
5440: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
5450: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
5460: 70 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b  pCur->skip!=0 ){
5470: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
5480: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
5490: 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30    *pHasMoved = 0
54a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
54b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
54c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
54d0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
54e0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
54f0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
5500: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
5510: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
5520: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
5530: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
5540: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
5550: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
5560: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
5570: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74  ge number..*/.st
5580: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
5590: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
55a0: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
55b0: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
55c0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
55d0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
55e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
55f0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5600: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 50 61  >mutex) );.  nPa
5610: 67 65 73 50 65 72 4d 61 70 50 61 67 65 20 3d 20  gesPerMapPage = 
5620: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
5630: 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70  /5)+1;.  iPtrMap
5640: 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67   = (pgno-2)/nPag
5650: 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20  esPerMapPage;.  
5660: 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e  ret = (iPtrMap*n
5670: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 29  PagesPerMapPage)
5680: 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72 65 74   + 2; .  if( ret
5690: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
56a0: 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
56b0: 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  ret++;.  }.  ret
56c0: 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn ret;.}../*.*
56d0: 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74 72 79  * Write an entry
56e0: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
56f0: 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  r map..**.** Thi
5700: 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61 74 65  s routine update
5710: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
5720: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
5730: 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a   number 'key'.**
5740: 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 70 73   so that it maps
5750: 20 74 6f 20 74 79 70 65 20 27 65 54 79 70 65 27   to type 'eType'
5760: 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65   and parent page
5770: 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a   number 'pgno'..
5780: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
5790: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
57a0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
57b0: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
57c0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
57d0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 50  atic int ptrmapP
57e0: 75 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ut(BtShared *pBt
57f0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65  , Pgno key, u8 e
5800: 54 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e  Type, Pgno paren
5810: 74 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  t){.  DbPage *pD
5820: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
5830: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5840: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
5850: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
5860: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
5870: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
5880: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
5890: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
58a0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
58b0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
58c0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
58d0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
58e0: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
58f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5900: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
5910: 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73   );.  /* The mas
5920: 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter-journal page
5930: 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 6e 65 76   number must nev
5940: 65 72 20 62 65 20 75 73 65 64 20 61 73 20 61 20  er be used as a 
5950: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
5960: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d   */.  assert( 0=
5970: 3d 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70  =PTRMAP_ISPAGE(p
5980: 42 74 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  Bt, PENDING_BYTE
5990: 5f 50 41 47 45 28 70 42 74 29 29 20 29 3b 0a 0a  _PAGE(pBt)) );..
59a0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
59b0: 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 69  utoVacuum );.  i
59c0: 66 28 20 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  f( key==0 ){.   
59d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
59e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
59f0: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
5a00: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
5a10: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
5a20: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
5a30: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
5a40: 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  p, &pDbPage);.  
5a50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5a60: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
5a70: 72 63 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  rc;.  }.  offset
5a80: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
5a90: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
5aa0: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
5ab0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5ac0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
5ad0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d  KPT;.  }.  pPtrm
5ae0: 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74  ap = (u8 *)sqlit
5af0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
5b00: 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20  DbPage);..  if( 
5b10: 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f  eType!=pPtrmap[o
5b20: 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79  ffset] || get4by
5b30: 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73  te(&pPtrmap[offs
5b40: 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29  et+1])!=parent )
5b50: 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54  {.    TRACE(("PT
5b60: 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d  RMAP_UPDATE: %d-
5b70: 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79  >(%d,%d)\n", key
5b80: 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29  , eType, parent)
5b90: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
5ba0: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
5bb0: 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
5bc0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5bd0: 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f  .      pPtrmap[o
5be0: 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a  ffset] = eType;.
5bf0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
5c00: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
5c10: 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20  ], parent);.    
5c20: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
5c30: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
5c40: 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
5c50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
5c60: 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68  an entry from th
5c70: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
5c80: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5c90: 65 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20  e retrieves the 
5ca0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
5cb0: 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27  y for page 'key'
5cc0: 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  , writing.** the
5cd0: 20 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74   type and parent
5ce0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
5cf0: 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67  *pEType and *pPg
5d00: 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e  no respectively.
5d10: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64  .** An error cod
5d20: 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  e is returned if
5d30: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
5d40: 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65  wrong, otherwise
5d50: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
5d60: 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70  tatic int ptrmap
5d70: 47 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  Get(BtShared *pB
5d80: 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20  t, Pgno key, u8 
5d90: 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70  *pEType, Pgno *p
5da0: 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  Pgno){.  DbPage 
5db0: 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54  *pDbPage;   /* T
5dc0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
5dd0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74  age */.  int iPt
5de0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
5df0: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
5e00: 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70  index */.  u8 *p
5e10: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
5e20: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
5e30: 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
5e40: 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
5e50: 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72  * Offset of entr
5e60: 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  y in pointer map
5e70: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
5e80: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
5e90: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
5ea0: 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50  >mutex) );..  iP
5eb0: 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50  trmap = PTRMAP_P
5ec0: 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b  AGENO(pBt, key);
5ed0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
5ee0: 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
5ef0: 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70  ger, iPtrmap, &p
5f00: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
5f10: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
5f20: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
5f30: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
5f40: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
5f50: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
5f60: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
5f70: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
5f80: 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28   key);.  assert(
5f90: 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20   pEType!=0 );.  
5fa0: 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61  *pEType = pPtrma
5fb0: 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28  p[offset];.  if(
5fc0: 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20   pPgno ) *pPgno 
5fd0: 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  = get4byte(&pPtr
5fe0: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a  map[offset+1]);.
5ff0: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
6000: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20  nref(pDbPage);. 
6010: 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c   if( *pEType<1 |
6020: 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65  | *pEType>5 ) re
6030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
6040: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75  UPT_BKPT;.  retu
6050: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6060: 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66  .#else /* if def
6070: 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ined SQLITE_OMIT
6080: 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20  _AUTOVACUUM */. 
6090: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
60a0: 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49  ut(w,x,y,z) SQLI
60b0: 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20  TE_OK.  #define 
60c0: 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c  ptrmapGet(w,x,y,
60d0: 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  z) SQLITE_OK.  #
60e0: 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74  define ptrmapPut
60f0: 4f 76 66 6c 50 74 72 28 78 2c 20 79 29 20 53 51  OvflPtr(x, y) SQ
6100: 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a  LITE_OK.#endif..
6110: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
6120: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
6130: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
6140: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
6150: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
6160: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
6170: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
6180: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
6190: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
61a0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
61b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
61c0: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
61d0: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
61e0: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
61f0: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
6200: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
6210: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
6220: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
6230: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
6240: 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28  te(&(P)->aData[(
6250: 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  P)->cellOffset+2
6260: 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  *(I)])))../*.** 
6270: 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70  This a more comp
6280: 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  lex version of f
6290: 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77  indCell() that w
62a0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65  orks for.** page
62b0: 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69  s that do contai
62c0: 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  n overflow cells
62d0: 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f  .  See insert.*/
62e0: 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64  .static u8 *find
62f0: 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d  OverflowCell(Mem
6300: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6310: 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69   iCell){.  int i
6320: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6330: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6340: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6350: 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61  ) );.  for(i=pPa
6360: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b  ge->nOverflow-1;
6370: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
6380: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75   int k;.    stru
6390: 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f  ct _OvflCell *pO
63a0: 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d  vfl;.    pOvfl =
63b0: 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69   &pPage->aOvfl[i
63c0: 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c  ];.    k = pOvfl
63d0: 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b  ->idx;.    if( k
63e0: 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  <=iCell ){.     
63f0: 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b   if( k==iCell ){
6400: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6410: 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20  pOvfl->pCell;.  
6420: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c      }.      iCel
6430: 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  l--;.    }.  }. 
6440: 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c   return findCell
6450: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a  (pPage, iCell);.
6460: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61  }../*.** Parse a
6470: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c   cell content bl
6480: 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20  ock and fill in 
6490: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72  the CellInfo str
64a0: 75 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a  ucture.  There.*
64b0: 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  * are two versio
64c0: 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ns of this funct
64d0: 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72  ion.  sqlite3Btr
64e0: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61  eeParseCell() ta
64f0: 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69  kes a .** cell i
6500: 6e 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f  ndex as the seco
6510: 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  nd argument and 
6520: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
6530: 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74  eCellPtr() .** t
6540: 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74  akes a pointer t
6550: 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68  o the body of th
6560: 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65  e cell as its se
6570: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
6580: 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73  *.** Within this
6590: 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65   file, the parse
65a0: 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e  Cell() macro can
65b0: 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
65c0: 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  ad of.** sqlite3
65d0: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
65e0: 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20  r(). Using some 
65f0: 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20  compilers, this 
6600: 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a  will be faster..
6610: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
6620: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
6630: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
6640: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
6650: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
6660: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
6670: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
6680: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
6690: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
66a0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
66b0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
66c0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
66d0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
66e0: 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20 20 20   u16 n;         
66f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
6700: 65 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c  er bytes in cell
6710: 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20   content header 
6720: 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61  */.  u32 nPayloa
6730: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
6740: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
6750: 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20  of cell payload 
6760: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
6770: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
6780: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
6790: 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ex) );..  pInfo-
67a0: 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  >pCell = pCell;.
67b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
67c0: 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67  >leaf==0 || pPag
67d0: 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  e->leaf==1 );.  
67e0: 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  n = pPage->child
67f0: 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  PtrSize;.  asser
6800: 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d  t( n==4-4*pPage-
6810: 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70  >leaf );.  if( p
6820: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
6830: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
6840: 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
6850: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  n += getVarint32
6860: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79  (&pCell[n], nPay
6870: 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  load);.    }else
6880: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
6890: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
68a0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
68b0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29  pCell[n], (u64*)
68c0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
68d0: 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20     pInfo->nData 
68e0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  = nPayload;.  }e
68f0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  lse{.    pInfo->
6900: 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e  nData = 0;.    n
6910: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
6920: 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c  &pCell[n], nPayl
6930: 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d  oad);.    pInfo-
6940: 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64  >nKey = nPayload
6950: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
6960: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
6970: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65  ad;.  pInfo->nHe
6980: 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20  ader = n;.  if( 
6990: 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c  likely(nPayload<
69a0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
69b0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  ) ){.    /* This
69c0: 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63   is the (easy) c
69d0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
69e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c   the entire payl
69f0: 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20  oad fits.    ** 
6a00: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
6a10: 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20  e.  No overflow 
6a20: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  is required..   
6a30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a   */.    int nSiz
6a40: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
6a50: 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c  otal size of cel
6a60: 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74  l content in byt
6a70: 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20  es */.    nSize 
6a80: 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a  = nPayload + n;.
6a90: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
6aa0: 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61  l = (u16)nPayloa
6ab0: 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f  d;.    pInfo->iO
6ac0: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
6ad0: 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20 7e 33   if( (nSize & ~3
6ae0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  )==0 ){.      nS
6af0: 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20 20 20  ize = 4;        
6b00: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
6b10: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 20  size is 4 */.   
6b20: 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53   }.    pInfo->nS
6b30: 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69 7a 65  ize = (u16)nSize
6b40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6b50: 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64  * If the payload
6b60: 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f   will not fit co
6b70: 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20  mpletely on the 
6b80: 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68  local page, we h
6b90: 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64 65  ave.    ** to de
6ba0: 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74 6f  cide how much to
6bb0: 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61   store locally a
6bc0: 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73  nd how much to s
6bd0: 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a 2a  pill onto.    **
6be0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
6bf0: 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69    The strategy i
6c00: 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68  s to minimize th
6c10: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73  e amount of unus
6c20: 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20  ed.    ** space 
6c30: 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  on overflow page
6c40: 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67 20  s while keeping 
6c50: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f  the amount of lo
6c60: 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20 20  cal storage.    
6c70: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
6c80: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
6c90: 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  cal..    **.    
6ca0: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
6cb0: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
6cc0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
6cd0: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
6ce0: 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79 20   any.    ** way 
6cf0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
6d00: 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66  n incompatible f
6d10: 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20 20  ile format..    
6d20: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f  */.    int minLo
6d30: 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  cal;  /* Minimum
6d40: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
6d50: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
6d60: 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c 6f  */.    int maxLo
6d70: 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d  cal;  /* Maximum
6d80: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
6d90: 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20  ad held locally 
6da0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70 6c  */.    int surpl
6db0: 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f  us;   /* Overflo
6dc0: 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c 61  w payload availa
6dd0: 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74  ble for local st
6de0: 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d 69  orage */..    mi
6df0: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
6e00: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d 61  minLocal;.    ma
6e10: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
6e20: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73 75  maxLocal;.    su
6e30: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
6e40: 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d   + (nPayload - m
6e50: 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d  inLocal)%(pPage-
6e60: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6e70: 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20 73   - 4);.    if( s
6e80: 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63  urplus <= maxLoc
6e90: 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66  al ){.      pInf
6ea0: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
6eb0: 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65  )surplus;.    }e
6ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  lse{.      pInfo
6ed0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
6ee0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a  minLocal;.    }.
6ef0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
6f00: 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70 49 6e  flow = (u16)(pIn
6f10: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 29 3b  fo->nLocal + n);
6f20: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
6f30: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
6f40: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
6f50: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
6f60: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
6f70: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
6f80: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
6f90: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
6fa0: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
6fb0: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
6fc0: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
6fd0: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
6fe0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6ff0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7000: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
7010: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
7020: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
7030: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
7040: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
7050: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
7060: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
7070: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
7080: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
7090: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
70a0: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
70b0: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
70c0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
70d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
70e0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
70f0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
7100: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
7110: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
7120: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
7130: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
7140: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
7150: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
7160: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
7170: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
7180: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
7190: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
71a0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ll pointer..*/.s
71b0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
71c0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
71d0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
71e0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
71f0: 26 70 43 65 6c 6c 5b 70 50 61 67 65 2d 3e 63 68  &pCell[pPage->ch
7200: 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 75  ildPtrSize];.  u
7210: 33 32 20 6e 53 69 7a 65 3b 0a 0a 23 69 66 64 65  32 nSize;..#ifde
7220: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
7230: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
7240: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
7250: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
7260: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
7270: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
7280: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
7290: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
72a0: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
72b0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
72c0: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
72d0: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
72e0: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
72f0: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
7300: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
7310: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
7320: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
7330: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
7340: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
7350: 69 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 42  info;.  sqlite3B
7360: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
7370: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
7380: 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64  debuginfo);.#end
7390: 69 66 0a 0a 20 20 69 66 28 20 70 50 61 67 65 2d  if..  if( pPage-
73a0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 75  >intKey ){.    u
73b0: 38 20 2a 70 45 6e 64 3b 0a 20 20 20 20 69 66 28  8 *pEnd;.    if(
73c0: 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20   pPage->hasData 
73d0: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 20 2b  ){.      pIter +
73e0: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 49  = getVarint32(pI
73f0: 74 65 72 2c 20 6e 53 69 7a 65 29 3b 0a 20 20 20  ter, nSize);.   
7400: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53   }else{.      nS
7410: 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ize = 0;.    }..
7420: 20 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77      /* pIter now
7430: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36   points at the 6
7440: 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65  4-bit integer ke
7450: 79 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61  y value, a varia
7460: 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20  ble length .    
7470: 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20  ** integer. The 
7480: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
7490: 6d 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70  moves pIter to p
74a0: 6f 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73  oint at the firs
74b0: 74 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61  t byte.    ** pa
74c0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
74d0: 65 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a  e key value. */.
74e0: 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65      pEnd = &pIte
74f0: 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28  r[9];.    while(
7500: 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30   (*pIter++)&0x80
7510: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
7520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
7530: 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e  Iter += getVarin
7540: 74 33 32 28 70 49 74 65 72 2c 20 6e 53 69 7a 65  t32(pIter, nSize
7550: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 53  );.  }..  if( nS
7560: 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ize>pPage->maxLo
7570: 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d  cal ){.    int m
7580: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
7590: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
75a0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
75b0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
75c0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
75d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
75e0: 20 34 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69   4);.    if( nSi
75f0: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
7600: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
7610: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
7620: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
7630: 20 34 3b 0a 20 20 7d 0a 20 20 6e 53 69 7a 65 20   4;.  }.  nSize 
7640: 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20 2d  += (u32)(pIter -
7650: 20 70 43 65 6c 6c 29 3b 0a 0a 20 20 2f 2a 20 54   pCell);..  /* T
7660: 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20  he minimum size 
7670: 6f 66 20 61 6e 79 20 63 65 6c 6c 20 69 73 20 34  of any cell is 4
7680: 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 69 66 28   bytes. */.  if(
7690: 20 6e 53 69 7a 65 3c 34 20 29 7b 0a 20 20 20 20   nSize<4 ){.    
76a0: 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 0a 0a  nSize = 4;.  }..
76b0: 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d    assert( nSize=
76c0: 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65  =debuginfo.nSize
76d0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
76e0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 23 69 66 6e 64  6)nSize;.}.#ifnd
76f0: 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
7700: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d 65   u16 cellSize(Me
7710: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
7720: 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74 75  t iCell){.  retu
7730: 72 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  rn cellSizePtr(p
7740: 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70  Page, findCell(p
7750: 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d  Page, iCell));.}
7760: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7770: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
7780: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66  OVACUUM./*.** If
7790: 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c   the cell pCell,
77a0: 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50   part of page pP
77b0: 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  age contains a p
77c0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20  ointer.** to an 
77d0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69  overflow page, i
77e0: 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69  nsert an entry i
77f0: 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  nto the pointer-
7800: 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f  map.** for the o
7810: 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f  verflow page..*/
7820: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7830: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d  apPutOvflPtr(Mem
7840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
7850: 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49  *pCell){.  CellI
7860: 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65  nfo info;.  asse
7870: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
7880: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
7890: 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
78a0: 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
78b0: 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f  .  assert( (info
78c0: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
78d0: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
78e0: 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f  y))==info.nPaylo
78f0: 61 64 20 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  ad );.  if( info
7900: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
7910: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
7920: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
7930: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
7940: 20 20 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61      return ptrma
7950: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
7960: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
7970: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
7980: 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pgno);.  }.  ret
7990: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
79a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
79b0: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
79c0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
79d0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
79e0: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
79f0: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
7a00: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
7a10: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
7a20: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
7a30: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
7a40: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
7a50: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
7a60: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
7a70: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
7a80: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
7a90: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
7aa0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
7ab0: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ad0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7ae0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
7b10: 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f  f a i-th cell */
7b20: 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20  .  int addr;    
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7b40: 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
7b50: 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c   byte after cell
7b60: 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a   pointer array *
7b70: 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
7b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7b90: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
7ba0: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
7bb0: 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7bd0: 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f  ize of a cell */
7be0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
7bf0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
7c00: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c   Number of usabl
7c10: 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67  e bytes on a pag
7c20: 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f  e */.  int cellO
7c30: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
7c40: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
7c50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
7c60: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63  array */.  int c
7c70: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
7c80: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
7c90: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
7ca0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
7cb0: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
7cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
7cd0: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
7ce0: 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  he page */.  uns
7cf0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
7d00: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  ;       /* The p
7d10: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e  age data */.  un
7d20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
7d30: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  p;       /* Temp
7d40: 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63   area for cell c
7d50: 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  ontent */..  ass
7d60: 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
7d70: 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
7d80: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
7d90: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
7da0: 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73  >pBt!=0 );.  ass
7db0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d  ert( pPage->pBt-
7dc0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53  >usableSize <= S
7dd0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
7de0: 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IZE );.  assert(
7df0: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
7e00: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
7e10: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7e20: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
7e30: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d  >mutex) );.  tem
7e40: 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  p = sqlite3Pager
7e50: 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d  TempSpace(pPage-
7e60: 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
7e70: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
7e80: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
7e90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7ea0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
7eb0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
7ec0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
7ed0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
7ee0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
7ef0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
7f00: 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a  ) );.  usableSiz
7f10: 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
7f20: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62  usableSize;.  cb
7f30: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
7f40: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
7f50: 65 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b  emcpy(&temp[cbrk
7f60: 5d 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20  ], &data[cbrk], 
7f70: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72  usableSize - cbr
7f80: 6b 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61  k);.  cbrk = usa
7f90: 62 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69  bleSize;.  for(i
7fa0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
7fb0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
7fc0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
7fd0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
7fe0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
7ff0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
8000: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
8010: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
8020: 0a 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61  .    if( pc>=usa
8030: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
8040: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
8050: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8060: 20 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65   }.    size = ce
8070: 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
8080: 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20   &temp[pc]);.   
8090: 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20   cbrk -= size;. 
80a0: 20 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c     if( cbrk<cell
80b0: 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c  Offset+2*nCell |
80c0: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
80d0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
80e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
80f0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
8100: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
8110: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
8120: 65 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a  e && cbrk>=0 );.
8130: 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
8140: 5b 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  [cbrk], &temp[pc
8150: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
8160: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
8170: 72 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  rk);.  }.  asser
8180: 74 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66  t( cbrk>=cellOff
8190: 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20  set+2*nCell );. 
81a0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
81b0: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
81c0: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
81d0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
81e0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
81f0: 37 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d  7] = 0;.  addr =
8200: 20 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43   cellOffset+2*nC
8210: 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64  ell;.  memset(&d
8220: 61 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62  ata[addr], 0, cb
8230: 72 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65  rk-addr);.  asse
8240: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
8250: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
8260: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
8270: 20 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d   if( cbrk-addr!=
8280: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
8290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
82a0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
82b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
82c0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
82d0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20   Allocate nByte 
82e0: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  bytes of space f
82f0: 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42  rom within the B
8300: 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73 65  -Tree page passe
8310: 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
8320: 74 20 61 72 67 75 6d 65 6e 74 2e 20 52 65 74 75  t argument. Retu
8330: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
8340: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
8350: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 69 72 73   of the .** firs
8360: 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61  t byte of alloca
8370: 74 65 64 20 73 70 61 63 65 2e 20 0a 2a 2a 0a 2a  ted space. .**.*
8380: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
8390: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
83a0: 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20 74   space between t
83b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 63 65  he end of the ce
83c0: 6c 6c 2d 6f 66 66 73 65 74 20 0a 2a 2a 20 61 72  ll-offset .** ar
83d0: 72 61 79 20 61 6e 64 20 74 68 65 20 73 74 61 72  ray and the star
83e0: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  t of the cell-co
83f0: 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 61 74  ntent area is at
8400: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
8410: 65 73 0a 2a 2a 20 69 6e 20 73 69 7a 65 2e 20 53  es.** in size. S
8420: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  o this routine c
8430: 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a  an never fail..*
8440: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
8450: 65 20 61 6c 72 65 61 64 79 20 36 30 20 6f 72 20  e already 60 or 
8460: 6d 6f 72 65 20 62 79 74 65 73 20 6f 66 20 66 72  more bytes of fr
8470: 61 67 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  agments within t
8480: 68 65 20 70 61 67 65 2c 0a 2a 2a 20 74 68 65 20  he page,.** the 
8490: 70 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65  page is defragme
84a0: 6e 74 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  nted before retu
84b0: 72 6e 69 6e 67 2e 20 49 66 20 74 68 69 73 20 77  rning. If this w
84c0: 65 72 65 20 6e 6f 74 20 64 6f 6e 65 20 74 68 65  ere not done the
84d0: 72 65 0a 2a 2a 20 69 73 20 61 20 63 68 61 6e 63  re.** is a chanc
84e0: 65 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  e that the numbe
84f0: 72 20 6f 66 20 66 72 61 67 6d 65 6e 74 65 64 20  r of fragmented 
8500: 62 79 74 65 73 20 63 6f 75 6c 64 20 65 76 65 6e  bytes could even
8510: 74 75 61 6c 6c 79 20 0a 2a 2a 20 6f 76 65 72 66  tually .** overf
8520: 6c 6f 77 20 74 68 65 20 73 69 6e 67 6c 65 2d 62  low the single-b
8530: 79 74 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  yte field of the
8540: 20 70 61 67 65 2d 68 65 61 64 65 72 20 69 6e 20   page-header in 
8550: 77 68 69 63 68 20 74 68 69 73 20 76 61 6c 75 65  which this value
8560: 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 2e 0a 2a  .** is stored..*
8570: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
8580: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
8590: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
85a0: 42 79 74 65 29 7b 0a 20 20 63 6f 6e 73 74 20 69  Byte){.  const i
85b0: 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  nt hdr = pPage->
85c0: 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a  hdrOffset;    /*
85d0: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
85e0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
85f0: 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
8600: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
8610: 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  Data;      /* Lo
8620: 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61  cal cache of pPa
8630: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69  ge->aData */.  i
8640: 6e 74 20 6e 46 72 61 67 3b 20 20 20 20 20 20 20  nt nFrag;       
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8670: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
8680: 73 20 6f 6e 20 70 50 61 67 65 20 2a 2f 0a 20 20  s on pPage */.  
8690: 69 6e 74 20 74 6f 70 3b 0a 20 20 0a 20 20 61 73  int top;.  .  as
86a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
86b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
86c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
86d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
86e0: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
86f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8700: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8710: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
8720: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
8730: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
8740: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
8750: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
8760: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
8770: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8780: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
8790: 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
87a0: 68 61 74 20 74 68 65 20 73 70 61 63 65 20 62 65  hat the space be
87b0: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 2d 6f  tween the cell-o
87c0: 66 66 73 65 74 20 61 72 72 61 79 20 61 6e 64 20  ffset array and 
87d0: 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 2d 63  the .  ** cell-c
87e0: 6f 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 67  ontent area is g
87f0: 72 65 61 74 65 72 20 74 68 61 6e 20 6e 42 79 74  reater than nByt
8800: 65 20 62 79 74 65 73 2e 0a 20 20 2a 2f 0a 20 20  e bytes..  */.  
8810: 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c 3d  assert( nByte <=
8820: 20 28 0a 20 20 20 20 20 20 67 65 74 32 62 79 74   (.      get2byt
8830: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 2d  e(&data[hdr+5])-
8840: 28 68 64 72 2b 38 2b 28 70 50 61 67 65 2d 3e 6c  (hdr+8+(pPage->l
8850: 65 61 66 3f 30 3a 34 29 2b 32 2a 67 65 74 32 62  eaf?0:4)+2*get2b
8860: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
8870: 29 29 0a 20 20 29 29 3b 0a 0a 20 20 6e 46 72 61  )).  ));..  nFra
8880: 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 3b  g = data[hdr+7];
8890: 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d 36 30  .  if( nFrag>=60
88a0: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
88b0: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
88c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53   }else{.    /* S
88d0: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
88e0: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
88f0: 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20 65   free slot big e
8900: 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66 79  nough to satisfy
8910: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71   .    ** the req
8920: 75 65 73 74 2e 20 54 68 65 20 61 6c 6c 6f 63 61  uest. The alloca
8930: 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 66 72 6f  tion is made fro
8940: 6d 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  m the first free
8950: 20 73 6c 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a   slot in .    **
8960: 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20 69   the list that i
8970: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  s large enough t
8980: 6f 20 61 63 63 6f 6d 61 64 61 74 65 20 69 74 2e  o accomadate it.
8990: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
89a0: 70 63 2c 20 61 64 64 72 3b 0a 20 20 20 20 66 6f  pc, addr;.    fo
89b0: 72 28 61 64 64 72 3d 68 64 72 2b 31 3b 20 28 70  r(addr=hdr+1; (p
89c0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  c = get2byte(&da
89d0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 3b 20 61 64  ta[addr]))>0; ad
89e0: 64 72 3d 70 63 29 7b 0a 20 20 20 20 20 20 69 6e  dr=pc){.      in
89f0: 74 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74  t size = get2byt
8a00: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 20  e(&data[pc+2]); 
8a10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66      /* Size of f
8a20: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20  ree slot */.    
8a30: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
8a40: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
8a50: 20 78 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74   x = size - nByt
8a60: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  e;.        if( x
8a70: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <4 ){.          
8a80: 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c  /* Remove the sl
8a90: 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ot from the free
8aa0: 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20 74 68  -list. Update th
8ab0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
8ac0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
8ad0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
8ae0: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
8af0: 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
8b00: 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74  data[addr], &dat
8b10: 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20  a[pc], 2);.     
8b20: 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d       data[hdr+7]
8b30: 20 3d 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20   = (u8)(nFrag + 
8b40: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  x);.        }els
8b50: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
8b60: 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73  The slot remains
8b70: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
8b80: 74 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69  t. Reduce its si
8b90: 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20  ze to account.  
8ba0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
8bb0: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
8bc0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
8bd0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
8be0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
8bf0: 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20  ta[pc+2], x);.  
8c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8c10: 72 65 74 75 72 6e 20 70 63 20 2b 20 78 3b 0a 20  return pc + x;. 
8c20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8c30: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
8c40: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
8c50: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
8c60: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
8c70: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
8c80: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
8c90: 61 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70  area..  */.  top
8ca0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
8cb0: 61 5b 68 64 72 2b 35 5d 29 20 2d 20 6e 42 79 74  a[hdr+5]) - nByt
8cc0: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
8cd0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
8ce0: 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f 70 3b 0a  ;.  return top;.
8cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8d00: 61 20 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  a section of the
8d10: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f   pPage->aData to
8d20: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
8d30: 2a 20 54 68 65 20 66 69 72 73 74 20 62 79 74 65  * The first byte
8d40: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 72 65 65   of the new free
8d50: 20 62 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d   block is pPage-
8d60: 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d 0a 2a 2a  >aDisk[start].**
8d70: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
8d80: 20 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 22 73   the block is "s
8d90: 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  ize" bytes..**.*
8da0: 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 65 66  * Most of the ef
8db0: 66 6f 72 74 20 68 65 72 65 20 69 73 20 69 6e 76  fort here is inv
8dc0: 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c 65 73 69  olved in coalesi
8dd0: 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 66  ng adjacent.** f
8de0: 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e 74 6f 20  ree blocks into 
8df0: 61 20 73 69 6e 67 6c 65 20 62 69 67 20 66 72 65  a single big fre
8e00: 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e block..*/.stat
8e10: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
8e20: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8e30: 20 69 6e 74 20 73 74 61 72 74 2c 20 69 6e 74 20   int start, int 
8e40: 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20 61 64 64  size){.  int add
8e50: 72 2c 20 70 62 65 67 69 6e 2c 20 68 64 72 3b 0a  r, pbegin, hdr;.
8e60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
8e70: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
8e80: 44 61 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28  Data;..  assert(
8e90: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
8ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
8eb0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
8ec0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
8ed0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
8ee0: 20 73 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68   start>=pPage->h
8ef0: 64 72 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67  drOffset+6+(pPag
8f00: 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20 29 3b 0a  e->leaf?0:4) );.
8f10: 20 20 61 73 73 65 72 74 28 20 28 73 74 61 72 74    assert( (start
8f20: 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61 67 65 2d   + size)<=pPage-
8f30: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
8f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
8f50: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8f60: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8f70: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8f80: 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20 20 2f 2a   size>=0 );   /*
8f90: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
8fa0: 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23 69 66 64  ze is 4 */..#ifd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ef SQLITE_SECURE
8fc0: 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76 65  _DELETE.  /* Ove
8fd0: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
8fe0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
8ff0: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 53  zeros when the S
9000: 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20 20  ECURE_DELETE .  
9010: 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61  ** option is ena
9020: 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  bled at compile-
9030: 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  time */.  memset
9040: 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 30  (&data[start], 0
9050: 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  , size);.#endif.
9060: 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73 70  .  /* Add the sp
9070: 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ace back into th
9080: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  e linked list of
9090: 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20   freeblocks */. 
90a0: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
90b0: 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72 20  rOffset;.  addr 
90c0: 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68 69  = hdr + 1;.  whi
90d0: 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67 65  le( (pbegin = ge
90e0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
90f0: 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70 62  r]))<start && pb
9100: 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61 73  egin>0 ){.    as
9110: 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70 50  sert( pbegin<=pP
9120: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
9130: 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 69 66  Size-4 );.    if
9140: 28 20 70 62 65 67 69 6e 3c 3d 61 64 64 72 20 29  ( pbegin<=addr )
9150: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
9160: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
9170: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
9180: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
9190: 7d 0a 20 20 69 66 20 28 20 70 62 65 67 69 6e 3e  }.  if ( pbegin>
91a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
91b0: 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a 20 20 20  leSize-4 ) {.   
91c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
91d0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
91e0: 0a 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69  .  assert( pbegi
91f0: 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65 67 69 6e  n>addr || pbegin
9200: 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ==0 );.  put2byt
9210: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 73  e(&data[addr], s
9220: 74 61 72 74 29 3b 0a 20 20 70 75 74 32 62 79 74  tart);.  put2byt
9230: 65 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  e(&data[start], 
9240: 70 62 65 67 69 6e 29 3b 0a 20 20 70 75 74 32 62  pbegin);.  put2b
9250: 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74 2b  yte(&data[start+
9260: 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 70 50 61  2], size);.  pPa
9270: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67  ge->nFree = pPag
9280: 65 2d 3e 6e 46 72 65 65 20 2b 20 28 75 31 36 29  e->nFree + (u16)
9290: 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f 61 6c  size;..  /* Coal
92a0: 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20 66 72  esce adjacent fr
92b0: 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 61  ee blocks */.  a
92c0: 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  ddr = pPage->hdr
92d0: 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20 77 68  Offset + 1;.  wh
92e0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
92f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
9300: 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20 20 69  dr]))>0 ){.    i
9310: 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a 65 2c  nt pnext, psize,
9320: 20 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   x;.    assert( 
9330: 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20  pbegin>addr );. 
9340: 20 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69     assert( pbegi
9350: 6e 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  n<=pPage->pBt->u
9360: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20  sableSize-4 );. 
9370: 20 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62     pnext = get2b
9380: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
9390: 5d 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20  ]);.    psize = 
93a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
93b0: 62 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69  begin+2]);.    i
93c0: 66 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a  f( pbegin + psiz
93d0: 65 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26  e + 3 >= pnext &
93e0: 26 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20  & pnext>0 ){.   
93f0: 20 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e     int frag = pn
9400: 65 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73  ext - (pbegin+ps
9410: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
9420: 28 66 72 61 67 3c 30 29 20 7c 7c 20 28 66 72 61  (frag<0) || (fra
9430: 67 3e 28 69 6e 74 29 64 61 74 61 5b 70 50 61 67  g>(int)data[pPag
9440: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 29  e->hdrOffset+7])
9450: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9460: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
9470: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  T_BKPT;.      }.
9480: 20 20 20 20 20 20 64 61 74 61 5b 70 50 61 67 65        data[pPage
9490: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d  ->hdrOffset+7] -
94a0: 3d 20 28 75 38 29 66 72 61 67 3b 0a 20 20 20 20  = (u8)frag;.    
94b0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
94c0: 64 61 74 61 5b 70 6e 65 78 74 5d 29 3b 0a 20 20  data[pnext]);.  
94d0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
94e0: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 78 29 3b 0a  ta[pbegin], x);.
94f0: 20 20 20 20 20 20 78 20 3d 20 70 6e 65 78 74 20        x = pnext 
9500: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
9510: 5b 70 6e 65 78 74 2b 32 5d 29 20 2d 20 70 62 65  [pnext+2]) - pbe
9520: 67 69 6e 3b 0a 20 20 20 20 20 20 70 75 74 32 62  gin;.      put2b
9530: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
9540: 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 7d 65 6c  +2], x);.    }el
9550: 73 65 7b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  se{.      addr =
9560: 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 7d 0a 20   pbegin;.    }. 
9570: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
9580: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
9590: 61 20 62 65 67 69 6e 73 20 77 69 74 68 20 61 20  a begins with a 
95a0: 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65 6d 6f 76  freeblock, remov
95b0: 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 64  e it. */.  if( d
95c0: 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64 61 74 61  ata[hdr+1]==data
95d0: 5b 68 64 72 2b 35 5d 20 26 26 20 64 61 74 61 5b  [hdr+5] && data[
95e0: 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b 68 64 72  hdr+2]==data[hdr
95f0: 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  +6] ){.    int t
9600: 6f 70 3b 0a 20 20 20 20 70 62 65 67 69 6e 20 3d  op;.    pbegin =
9610: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
9620: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6d 65 6d  hdr+1]);.    mem
9630: 63 70 79 28 26 64 61 74 61 5b 68 64 72 2b 31 5d  cpy(&data[hdr+1]
9640: 2c 20 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  , &data[pbegin],
9650: 20 32 29 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   2);.    top = g
9660: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
9670: 72 2b 35 5d 29 20 2b 20 67 65 74 32 62 79 74 65  r+5]) + get2byte
9680: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d  (&data[pbegin+2]
9690: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
96a0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
96b0: 70 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  p);.  }.  assert
96c0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
96d0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
96e0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  >pDbPage) );.  r
96f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
9700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65  .}../*.** Decode
9710: 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
9720: 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
9730: 6f 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66  of the header) f
9740: 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64  or a page.** and
9750: 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c   initialize fiel
9760: 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ds of the MemPag
9770: 65 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f  e structure acco
9780: 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f  rdingly..**.** O
9790: 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nly the followin
97a0: 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  g combinations a
97b0: 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41  re supported.  A
97c0: 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  nything differen
97d0: 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61  t.** indicates a
97e0: 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
97f0: 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  e files:.**.**  
9800: 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44         PTF_ZEROD
9810: 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50  ATA.**         P
9820: 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54  TF_ZERODATA | PT
9830: 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20  F_LEAF.**       
9840: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
9850: 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20   PTF_INTKEY.**  
9860: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
9870: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
9880: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73   | PTF_LEAF.*/.s
9890: 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65  tatic int decode
98a0: 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70  Flags(MemPage *p
98b0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79  Page, int flagBy
98c0: 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  te){.  BtShared 
98d0: 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63  *pBt;     /* A c
98e0: 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42  opy of pPage->pB
98f0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
9900: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
9910: 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  ==(pPage->pgno==
9920: 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a  1 ? 100 : 0) );.
9930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9940: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9950: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9960: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66  );.  pPage->leaf
9970: 20 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65   = (u8)(flagByte
9980: 3e 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50  >>3);  assert( P
9990: 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20  TF_LEAF == 1<<3 
99a0: 29 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d  );.  flagByte &=
99b0: 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50   ~PTF_LEAF;.  pP
99c0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
99d0: 65 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c  e = 4-4*pPage->l
99e0: 65 61 66 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  eaf;.  pBt = pPa
99f0: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
9a00: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
9a10: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
9a20: 4b 45 59 29 20 29 7b 0a 20 20 20 20 70 50 61 67  KEY) ){.    pPag
9a30: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
9a40: 20 20 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74     pPage->hasDat
9a50: 61 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b  a = pPage->leaf;
9a60: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c  .    pPage->maxL
9a70: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c  ocal = pBt->maxL
9a80: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
9a90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  minLocal = pBt->
9aa0: 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65  minLeaf;.  }else
9ab0: 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50   if( flagByte==P
9ac0: 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20  TF_ZERODATA ){. 
9ad0: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
9ae0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d   = 0;.    pPage-
9af0: 3e 68 61 73 44 61 74 61 20 3d 20 30 3b 0a 20 20  >hasData = 0;.  
9b00: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
9b10: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
9b20: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
9b30: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
9b40: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
9b50: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9b60: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
9b70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
9b80: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
9b90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
9ba0: 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72   auxiliary infor
9bb0: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73  mation for a dis
9bc0: 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  k block..**.** R
9bd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
9be0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20  on success.  If 
9bf0: 77 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20  we see that the 
9c00: 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74  page does.** not
9c10: 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d   contain a well-
9c20: 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
9c30: 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72  page, then retur
9c40: 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  n .** SQLITE_COR
9c50: 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74  RUPT.  Note that
9c60: 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c   a return of SQL
9c70: 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a  ITE_OK does not.
9c80: 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61  ** guarantee tha
9c90: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65  t the page is we
9ca0: 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f  ll-formed.  It o
9cb0: 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a  nly shows that.*
9cc0: 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64  * we failed to d
9cd0: 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70  etect any corrup
9ce0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
9cf0: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
9d00: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
9d10: 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  ){..  assert( pP
9d20: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
9d30: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9d40: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9d50: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9d60: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
9d70: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
9d80: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
9d90: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
9da0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9db0: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
9dc0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
9dd0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
9de0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
9df0: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
9e00: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
9e10: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
9e20: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
9e30: 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20  Init ){.    u16 
9e40: 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pc;            /
9e50: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66  * Address of a f
9e60: 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20  reeblock within 
9e70: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a  pPage->aData[] *
9e80: 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20 20  /.    u8 hdr;   
9e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
9ea0: 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20  et to beginning 
9eb0: 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
9ec0: 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20  /.    u8 *data; 
9ed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61           /* Equa
9ee0: 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  l to pPage->aDat
9ef0: 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65  a */.    BtShare
9f00: 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f  d *pBt;        /
9f10: 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65  * The main btree
9f20: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
9f30: 20 20 75 31 36 20 75 73 61 62 6c 65 53 69 7a 65    u16 usableSize
9f40: 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f  ;    /* Amount o
9f50: 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f  f usable space o
9f60: 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20  n each page */. 
9f70: 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65     u16 cellOffse
9f80: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
9f90: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
9fa0: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
9fb0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
9fc0: 75 31 36 20 6e 46 72 65 65 3b 20 20 20 20 20 20  u16 nFree;      
9fd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9fe0: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
9ff0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
a000: 75 31 36 20 74 6f 70 3b 20 20 20 20 20 20 20 20  u16 top;        
a010: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
a020: 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
a030: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 0a 20 20  tent area */..  
a040: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
a050: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
a060: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
a070: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
a080: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 69 66  e->aData;.    if
a090: 28 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50  ( decodeFlags(pP
a0a0: 61 67 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20  age, data[hdr]) 
a0b0: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
a0c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
a0d0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
a0e0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
a0f0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 33  pBt->pageSize<=3
a100: 32 37 36 38 20 29 3b 0a 20 20 20 20 70 50 61 67  2768 );.    pPag
a110: 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42  e->maskPage = pB
a120: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b  t->pageSize - 1;
a130: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
a140: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75  rflow = 0;.    u
a150: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
a160: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20  >usableSize;.   
a170: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
a180: 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  et = cellOffset 
a190: 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34 2a 70  = hdr + 12 - 4*p
a1a0: 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20 20  Page->leaf;.    
a1b0: 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
a1c0: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
a1d0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
a1e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
a1f0: 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28  hdr+3]);.    if(
a200: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58   pPage->nCell>MX
a210: 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20  _CELL(pBt) ){.  
a220: 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
a230: 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
a240: 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
a250: 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
a260: 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  t */.      retur
a270: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
a280: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
a290: 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64    /* A malformed
a2a0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
a2b0: 69 67 68 74 20 63 61 75 73 65 20 75 73 65 20 74  ight cause use t
a2c0: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
a2d0: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
a2e0: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
a2f0: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
a300: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
a310: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
a320: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
a330: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
a340: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
a350: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a360: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
a370: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
a380: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
a390: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
a3a0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
a3b0: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
a3c0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f  (SQLITE_ENABLE_O
a3d0: 56 45 52 53 49 5a 45 5f 43 45 4c 4c 5f 43 48 45  VERSIZE_CELL_CHE
a3e0: 43 4b 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  CK).    {.      
a3f0: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
a400: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
a410: 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78 20  able cell index 
a420: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 43 65  */.      int iCe
a430: 6c 6c 4c 61 73 74 3b 20 20 20 20 2f 2a 20 4c 61  llLast;    /* La
a440: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
a450: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
a460: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
a470: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
a480: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
a490: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
a4a0: 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20  int sz;         
a4b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
a4c0: 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 43  ell */..      iC
a4d0: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
a4e0: 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d  ffset + 2*pPage-
a4f0: 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 20 20 69 43  >nCell;.      iC
a500: 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65  ellLast = usable
a510: 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 20 20  Size - 4;.      
a520: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
a530: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
a540: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a550: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
a560: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
a570: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a580: 5b 63 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d  [cellOffset+i*2]
a590: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a5a0: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
a5b0: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
a5c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a5d0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
a5e0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
a5f0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c          sz = cel
a600: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
a610: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
a620: 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
a630: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
a640: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a650: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
a660: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a670: 20 20 7d 0a 20 20 20 20 7d 20 20 0a 23 65 6e 64    }.    }  .#end
a680: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  if..    /* Compu
a690: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
a6a0: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
a6b0: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
a6c0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
a6d0: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
a6e0: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
a6f0: 2b 20 74 6f 70 3b 0a 20 20 20 20 77 68 69 6c 65  + top;.    while
a700: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
a710: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
a720: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
a730: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
a740: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
a750: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
a760: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
a770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
a780: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
a790: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
a7a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
a7b0: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
a7c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
a7d0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
a7e0: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
a7f0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
a800: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
a810: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
a820: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
a830: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
a840: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
a850: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
a860: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
a870: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
a880: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
a890: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
a8a0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
a8b0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
a8c0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
a8d0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
a8e0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
a8f0: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
a900: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
a910: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
a920: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
a930: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
a940: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
a950: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
a960: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
a970: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
a980: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
a990: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
a9a0: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
a9b0: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
a9c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
a9d0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
a9e0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
a9f0: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
aa00: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
aa10: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
aa20: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
aa30: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
aa40: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
aa50: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
aa60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
aa70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
aa80: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
aa90: 46 72 65 65 20 3d 20 6e 46 72 65 65 20 2d 20 28  Free = nFree - (
aaa0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
aab0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 0a 23  Page->nCell);..#
aac0: 69 66 20 30 0a 20 20 2f 2a 20 43 68 65 63 6b 20  if 0.  /* Check 
aad0: 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66 66  that all the off
aae0: 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c 6c  sets in the cell
aaf0: 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61 72   offset array ar
ab00: 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20  e within range. 
ab10: 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 4f 6d 69 74  .  ** .  ** Omit
ab20: 74 69 6e 67 20 74 68 69 73 20 63 6f 6e 73 69 73  ting this consis
ab30: 74 65 6e 63 79 20 63 68 65 63 6b 20 61 6e 64 20  tency check and 
ab40: 75 73 69 6e 67 20 74 68 65 20 70 50 61 67 65 2d  using the pPage-
ab50: 3e 6d 61 73 6b 50 61 67 65 20 6d 61 73 6b 0a 20  >maskPage mask. 
ab60: 20 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 6f   ** to prevent o
ab70: 76 65 72 72 75 6e 6e 69 6e 67 20 74 68 65 20 70  verrunning the p
ab80: 61 67 65 20 62 75 66 66 65 72 20 69 6e 20 66 69  age buffer in fi
ab90: 6e 64 43 65 6c 6c 28 29 20 72 65 73 75 6c 74 73  ndCell() results
aba0: 20 69 6e 20 61 0a 20 20 2a 2a 20 32 2e 35 25 20   in a.  ** 2.5% 
abb0: 70 65 72 66 6f 72 6d 61 6e 63 65 20 67 61 69 6e  performance gain
abc0: 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75  ..  */.  {.    u
abd0: 38 20 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20  8 *pOff;        
abe0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
abf0: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
ac00: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
ac10: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 75  n range */.    u
ac20: 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20  8 *pEnd;        
ac30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
ac40: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
ac50: 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 75 38   array */.    u8
ac60: 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f   mask;         /
ac70: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
ac80: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
ac90: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
aca0: 6f 66 66 73 65 74 73 20 2a 2f 0a 20 20 20 20 6d  offsets */.    m
acb0: 61 73 6b 20 3d 20 7e 28 28 28 75 38 29 28 70 42  ask = ~(((u8)(pB
acc0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 29  t->pageSize>>8))
acd0: 2d 31 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d 20  -1);.    pEnd = 
ace0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
acf0: 20 2b 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2a   + pPage->nCell*
ad00: 32 5d 3b 0a 20 20 20 20 66 6f 72 28 70 4f 66 66  2];.    for(pOff
ad10: 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  =&data[cellOffse
ad20: 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e 64 20 26  t]; pOff!=pEnd &
ad30: 26 20 21 28 28 2a 70 4f 66 66 29 26 6d 61 73 6b  & !((*pOff)&mask
ad40: 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a 20 20 20  ); pOff+=2);.   
ad50: 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64 20   if( pOff!=pEnd 
ad60: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
ad70: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ad80: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
ad90: 65 6e 64 69 66 0a 0a 20 20 20 20 70 50 61 67 65  endif..    pPage
ada0: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
adb0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
adc0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
add0: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
ade0: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
adf0: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
ae00: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
ae10: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
ae20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
ae30: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
ae40: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
ae50: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
ae60: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
ae70: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
ae80: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
ae90: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
aea0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
aeb0: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
aec0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
aed0: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
aee0: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
aef0: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
af00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
af10: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
af20: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
af30: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
af40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
af50: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
af60: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
af70: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
af80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
af90: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
afa0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
afb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
afc0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
afd0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
afe0: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
aff0: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
b000: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
b010: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
b020: 28 63 68 61 72 29 66 6c 61 67 73 3b 0a 20 20 66  (char)flags;.  f
b030: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
b040: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
b050: 45 41 46 29 3d 3d 30 20 3f 31 3a 30 29 3b 0a 20  EAF)==0 ?1:0);. 
b060: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64   memset(&data[hd
b070: 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64  r+1], 0, 4);.  d
b080: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a  ata[hdr+7] = 0;.
b090: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b0a0: 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73  [hdr+5], pBt->us
b0b0: 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  ableSize);.  pPa
b0c0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d  ge->nFree = pBt-
b0d0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
b0e0: 72 73 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61  rst;.  decodeFla
b0f0: 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29  gs(pPage, flags)
b100: 3b 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  ;.  pPage->hdrOf
b110: 66 73 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50  fset = hdr;.  pP
b120: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
b130: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
b140: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
b150: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
b160: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
b170: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d   pBt->pageSize<=
b180: 33 32 37 36 38 20 29 3b 0a 20 20 70 50 61 67 65  32768 );.  pPage
b190: 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 70 42 74  ->maskPage = pBt
b1a0: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 3b 0a  ->pageSize - 1;.
b1b0: 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
b1c0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49   0;.  pPage->isI
b1d0: 6e 69 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  nit = 1;.}.../*.
b1e0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50  ** Convert a DbP
b1f0: 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  age obtained fro
b200: 6d 20 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f  m the pager into
b210: 20 61 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20   a MemPage used 
b220: 62 79 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  by.** the btree 
b230: 6c 61 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  layer..*/.static
b240: 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50   MemPage *btreeP
b250: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62  ageFromDbPage(Db
b260: 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50  Page *pDbPage, P
b270: 67 6e 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72  gno pgno, BtShar
b280: 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50  ed *pBt){.  MemP
b290: 61 67 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65  age *pPage = (Me
b2a0: 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61  mPage*)sqlite3Pa
b2b0: 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50  gerGetExtra(pDbP
b2c0: 61 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61  age);.  pPage->a
b2d0: 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61  Data = sqlite3Pa
b2e0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
b2f0: 67 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44  ge);.  pPage->pD
b300: 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b  bPage = pDbPage;
b310: 0a 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20  .  pPage->pBt = 
b320: 70 42 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  pBt;.  pPage->pg
b330: 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61  no = pgno;.  pPa
b340: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
b350: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
b360: 20 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75   100 : 0;.  retu
b370: 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
b380: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
b390: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
b3a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
b3b0: 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
b3c0: 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
b3d0: 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
b3e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
b3f0: 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20   noContent flag 
b400: 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
b410: 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
b420: 63 61 72 65 20 61 62 6f 75 74 0a 2a 2a 20 74 68  care about.** th
b430: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
b440: 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
b450: 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
b460: 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
b470: 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
b480: 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
b490: 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
b4a0: 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
b4b0: 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
b4c0: 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
b4d0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
b4e0: 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
b4f0: 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
b500: 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
b510: 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
b520: 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
b530: 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
b540: 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
b550: 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
b560: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
b570: 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
b580: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
b590: 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
b5a0: 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
b5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b5c0: 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
b5d0: 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
b5e0: 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
b5f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
b600: 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
b610: 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
b620: 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20   noContent      
b630: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6c 6f 61 64    /* Do not load
b640: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 66   page content if
b650: 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
b660: 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20 2a  t rc;.  DbPage *
b670: 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  pDbPage;..  asse
b680: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b690: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
b6a0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
b6b0: 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
b6c0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
b6d0: 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
b6e0: 44 62 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  DbPage, noConten
b6f0: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
b700: 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
b710: 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
b720: 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
b730: 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
b740: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b750: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
b760: 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
b770: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
b780: 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
b790: 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
b7a0: 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
b7b0: 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
b7c0: 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
b7d0: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
b7e0: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
b7f0: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
b800: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
b810: 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
b820: 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
b830: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
b840: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
b850: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
b860: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b870: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
b880: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
b890: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
b8a0: 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
b8b0: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
b8c0: 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
b8d0: 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
b8e0: 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
b8f0: 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
b900: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b910: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
b920: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
b930: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b940: 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
b950: 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
b960: 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
b970: 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
b980: 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
b990: 63 20 50 67 6e 6f 20 70 61 67 65 72 50 61 67 65  c Pgno pagerPage
b9a0: 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
b9b0: 70 42 74 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  pBt){.  int nPag
b9c0: 65 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63  e = -1;.  int rc
b9d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
b9e0: 3e 70 50 61 67 65 31 20 29 3b 0a 20 20 72 63 20  >pPage1 );.  rc 
b9f0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
ba00: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
ba10: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
ba20: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
ba30: 54 45 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3d 3d  TE_OK || nPage==
ba40: 2d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  -1 );.  return (
ba50: 50 67 6e 6f 29 6e 50 61 67 65 3b 0a 7d 0a 0a 2f  Pgno)nPage;.}../
ba60: 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20  *.** Get a page 
ba70: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61  from the pager a
ba80: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
ba90: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
baa0: 2a 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e  ** is just a con
bab0: 76 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72  venience wrapper
bac0: 20 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65   around separate
bad0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
bae0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
baf0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74  () and sqlite3Bt
bb00: 72 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a  reeInitPage()..*
bb10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
bb20: 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
bb30: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
bb40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
bb50: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
bb60: 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
bb70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bb80: 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67  of the page to g
bb90: 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  et */.  MemPage 
bba0: 2a 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20  **ppPage     /* 
bbb0: 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
bbc0: 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29  ointer here */.)
bbd0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
bbe0: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
bbf0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bc00: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
bc10: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
bc20: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
bc30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
bc40: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
bc50: 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f 66 74  ..  /* It is oft
bc60: 65 6e 20 74 68 65 20 63 61 73 65 20 74 68 61 74  en the case that
bc70: 20 74 68 65 20 70 61 67 65 20 77 65 20 77 61 6e   the page we wan
bc80: 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
bc90: 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66 20 73  cache..  ** If s
bca0: 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65 63 74  o, get it direct
bcb0: 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65 73 20  ly.  This saves 
bcc0: 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67 20 74  us from having t
bcd0: 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61 67 65  o call.  ** page
bce0: 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74 6f 20  rPagecount() to 
bcf0: 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f 20 69  make sure pgno i
bd00: 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74 73 2c  s within limits,
bd10: 20 77 68 69 63 68 20 72 65 73 75 6c 74 73 0a 20   which results. 
bd20: 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75 72 65   ** in a measure
bd30: 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  able performance
bd40: 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e 0a 20   improvements.. 
bd50: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   */.  *ppPage = 
bd60: 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
bd70: 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 70 67 6e  eLookup(pBt, pgn
bd80: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 20  o);.  if( pPage 
bd90: 29 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 69  ){.    /* Page i
bda0: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  s already in cac
bdb0: 68 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53  he */.    rc = S
bdc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
bdd0: 65 7b 0a 20 20 20 20 2f 2a 20 50 61 67 65 20 6e  e{.    /* Page n
bde0: 6f 74 20 69 6e 20 63 61 63 68 65 2e 20 20 41 63  ot in cache.  Ac
bdf0: 71 75 69 72 65 20 69 74 2e 20 2a 2f 0a 20 20 20  quire it. */.   
be00: 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
be10: 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
be20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
be30: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
be40: 54 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  T; .    }.    rc
be50: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
be60: 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  etPage(pBt, pgno
be70: 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
be80: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
be90: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20  n rc;.    pPage 
bea0: 3d 20 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20  = *ppPage;.  }. 
beb0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49   if( !pPage->isI
bec0: 6e 69 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  nit ){.    rc = 
bed0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
bee0: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
bef0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
bf00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65  E_OK ){.    rele
bf10: 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
bf20: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
bf30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
bf40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
bf50: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
bf60: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
bf70: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
bf80: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
bf90: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
bfa0: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
bfb0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
bfc0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
bfd0: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
bfe0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
bff0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
c000: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
c010: 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
c020: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3e  pPage->pDbPage)>
c030: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
c040: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
c050: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
c060: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61  ge->pBt );.    a
c070: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
c080: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
c090: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
c0a0: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
c0b0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
c0c0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
c0d0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
c0e0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
c0f0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c100: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c110: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c120: 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
c130: 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
c140: 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
c150: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  }../*.** During 
c160: 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
c170: 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
c180: 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
c190: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
c1a0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
c1b0: 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
c1c0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
c1d0: 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
c1e0: 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
c1f0: 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
c200: 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
c210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c220: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
c230: 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
c240: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
c250: 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
c260: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
c270: 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
c280: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
c290: 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
c2a0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
c2b0: 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
c2c0: 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
c2d0: 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
c2e0: 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
c2f0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
c300: 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
c310: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c320: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
c330: 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
c340: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
c350: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
c360: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
c370: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
c380: 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
c390: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
c3a0: 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
c3b0: 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
c3c0: 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
c3d0: 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
c3e0: 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
c3f0: 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
c400: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
c410: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
c420: 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
c430: 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
c440: 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
c450: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
c460: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c470: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  BtreeInitPage() 
c480: 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
c490: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
c4a0: 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
c4b0: 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
c4c0: 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
c4d0: 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
c4e0: 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
c4f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
c500: 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
c510: 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
c520: 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
c530: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
c540: 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
c550: 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
c560: 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
c570: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c580: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
c590: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
c5a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
c5b0: 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
c5c0: 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f   for a btree..*/
c5d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
c5e0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
c5f0: 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  er(void *pArg){.
c600: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
c610: 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70 41 72  = (BtShared*)pAr
c620: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  g;.  assert( pBt
c630: 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74  ->db );.  assert
c640: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
c650: 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75  held(pBt->db->mu
c660: 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
c670: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
c680: 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e  syHandler(&pBt->
c690: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29  db->busyHandler)
c6a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
c6b0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  a database file.
c6c0: 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .** .** zFilenam
c6d0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
c6e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c6f0: 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d  le.  If zFilenam
c700: 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61 20 6e  e is NULL.** a n
c710: 65 77 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ew database with
c720: 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65 20 69   a random name i
c730: 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 69 73  s created.  This
c740: 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65 64 0a   randomly named.
c750: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
c760: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
c770: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72   when sqlite3Btr
c780: 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  eeClose() is cal
c790: 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  led..** If zFile
c7a0: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
c7b0: 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
c7c0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
c7d0: 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
c7e0: 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
c7f0: 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
c800: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
c810: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
c820: 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
c830: 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
c840: 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
c850: 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
c860: 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
c870: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
c880: 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
c890: 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
c8a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
c8b0: 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
c8c0: 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
c8d0: 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
c8e0: 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
c8f0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
c900: 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
c910: 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
c920: 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
c930: 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
c940: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
c950: 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63  eOpen(.  const c
c960: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
c970: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
c980: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
c990: 74 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61  the BTree databa
c9a0: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
c9b0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
c9c0: 2f 2a 20 41 73 73 6f 63 69 61 74 65 64 20 64 61  /* Associated da
c9d0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
c9e0: 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72  .  Btree **ppBtr
c9f0: 65 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ee,        /* Po
ca00: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72  inter to new Btr
ca10: 65 65 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65  ee object writte
ca20: 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  n here */.  int 
ca30: 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
ca40: 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a      /* Options *
ca50: 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ca70: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
ca80: 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  ugh to sqlite3_v
ca90: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b  fs.xOpen() */.){
caa0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
cab0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  pVfs;           
cac0: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20    /* The VFS to 
cad0: 75 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72  use for this btr
cae0: 65 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ee */.  BtShared
caf0: 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20   *pBt = 0;      
cb00: 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
cb10: 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20 73   part of btree s
cb20: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74  tructure */.  Bt
cb30: 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ree *p;         
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cb50: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e  Handle to return
cb60: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
cb70: 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d  tex *mutexOpen =
cb80: 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73   0;  /* Prevents
cb90: 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
cba0: 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37 20  n. Ticket #3537 
cbb0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
cbc0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
cbd0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
cbe0: 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  de from this fun
cbf0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52  ction */.  u8 nR
cc00: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
cc10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
cc20: 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  e of unused spac
cc30: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
cc40: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
cc50: 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d  r zDbHeader[100]
cc60: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68  ;  /* Database h
cc70: 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f  eader content */
cc80: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
cc90: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
cca0: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
ccb0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
ccc0: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
ccd0: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
cce0: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
ccf0: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
cd00: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
cd10: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
cd20: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
cd30: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
cd40: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
cd50: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
cd60: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
cd70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
cd80: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
cd90: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
cda0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cdb0: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
cdc0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
cdd0: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
cde0: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
cdf0: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
ce00: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
ce10: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
ce20: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
ce30: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
ce40: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
ce50: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
ce60: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ce70: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
ce80: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
ce90: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
cea0: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
ceb0: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
cec0: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
ced0: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
cee0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
cef0: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
cf00: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
cf10: 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64  ->db = db;.#ifnd
cf20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
cf30: 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d  HARED_CACHE.  p-
cf40: 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70  >lock.pBtree = p
cf50: 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62  ;.  p->lock.iTab
cf60: 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a  le = 1;.#endif..
cf70: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
cf80: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
cf90: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
cfa0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
cfb0: 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a  ISKIO).  /*.  **
cfc0: 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69   If this Btree i
cfd0: 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f  s a candidate fo
cfe0: 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20  r shared cache, 
cff0: 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20  try to find an. 
d000: 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53   ** existing BtS
d010: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61  hared object tha
d020: 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77  t we can share w
d030: 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ith.  */.  if( i
d040: 73 4d 65 6d 64 62 3d 3d 30 20 26 26 20 7a 46 69  sMemdb==0 && zFi
d050: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
d060: 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66  ame[0] ){.    if
d070: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
d080: 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
d090: 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
d0a0: 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e    int nFullPathn
d0b0: 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
d0c0: 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20  thname+1;.      
d0d0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
d0e0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
d0f0: 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  loc(nFullPathnam
d100: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
d110: 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
d120: 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 73  ared;.      p->s
d130: 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  harable = 1;.   
d140: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
d150: 53 51 4c 49 54 45 5f 53 68 61 72 65 64 43 61 63  SQLITE_SharedCac
d160: 68 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  he;.      if( !z
d170: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
d180: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d190: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
d1a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
d1b0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
d1c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 75 6c      sqlite3OsFul
d1d0: 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20  lPathname(pVfs, 
d1e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c  zFilename, nFull
d1f0: 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
d200: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
d210: 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
d220: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
d230: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
d240: 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
d250: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
d260: 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
d270: 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
d280: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
d290: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
d2a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
d2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d2c0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
d2d0: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
d2e0: 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
d2f0: 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
d300: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
d310: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
d320: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
d330: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
d340: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
d350: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
d360: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
d370: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
d380: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3a0: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
d3b0: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
d3c0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
d3d0: 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
d3e0: 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
d3f0: 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
d400: 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
d410: 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
d420: 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
d430: 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
d440: 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
d450: 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
d460: 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
d470: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d480: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d490: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
d4b0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
d4c0: 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
d4d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
d4e0: 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
d4f0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
d500: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
d510: 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
d520: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d530: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
d540: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
d550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d560: 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
d570: 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
d580: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
d590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d5a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d5b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
d5c0: 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
d5d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
d5e0: 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
d5f0: 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
d600: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
d610: 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
d620: 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
d630: 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
d640: 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
d650: 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
d660: 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
d670: 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
d680: 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
d690: 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
d6a0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
d6b0: 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
d6c0: 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
d6d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
d6e0: 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
d6f0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
d700: 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
d710: 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
d720: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
d730: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
d740: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
d750: 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
d760: 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
d770: 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
d780: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
d790: 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
d7a0: 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
d7b0: 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
d7c0: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
d7d0: 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
d7e0: 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
d7f0: 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
d800: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
d810: 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
d820: 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
d830: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d840: 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 7c  sizeof(i64)==8 |
d850: 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 34  | sizeof(i64)==4
d860: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d870: 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 7c  sizeof(u64)==8 |
d880: 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 34  | sizeof(u64)==4
d890: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
d8a0: 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29  sizeof(u32)==4 )
d8b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
d8c0: 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a  zeof(u16)==2 );.
d8d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
d8e0: 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20  of(Pgno)==4 );. 
d8f0: 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69   .    pBt = sqli
d900: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
d910: 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20  izeof(*pBt) );. 
d920: 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b     if( pBt==0 ){
d930: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
d940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
d950: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
d960: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
d970: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
d980: 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d  Open(pVfs, &pBt-
d990: 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61  >pPager, zFilena
d9a0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
d9c0: 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  TRA_SIZE, flags,
d9d0: 20 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20   vfsFlags);.    
d9e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
d9f0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
da00: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64  sqlite3PagerRead
da10: 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e  Fileheader(pBt->
da20: 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44  pPager,sizeof(zD
da30: 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64  bHeader),zDbHead
da40: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  er);.    }.    i
da50: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
da60: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62   ){.      goto b
da70: 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20  tree_open_out;. 
da80: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 64 62     }.    pBt->db
da90: 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74   = db;.    sqlit
daa0: 65 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61  e3PagerSetBusyha
dab0: 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65  ndler(pBt->pPage
dac0: 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75  r, btreeInvokeBu
dad0: 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b  syHandler, pBt);
dae0: 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42  .    p->pBt = pB
daf0: 74 3b 0a 20 20 0a 20 20 20 20 73 71 6c 69 74 65  t;.  .    sqlite
db00: 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
db10: 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  r(pBt->pPager, p
db20: 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
db30: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30  pBt->pCursor = 0
db40: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
db50: 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  1 = 0;.    pBt->
db60: 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c 69 74  readOnly = sqlit
db70: 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
db80: 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  y(pBt->pPager);.
db90: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
dba0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 7a 44  e = get2byte(&zD
dbb0: 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a 20 20  bHeader[16]);.  
dbc0: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
dbd0: 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e  ize<512 || pBt->
dbe0: 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
dbf0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20  MAX_PAGE_SIZE.  
dc00: 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d         || ((pBt-
dc10: 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74  >pageSize-1)&pBt
dc20: 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29  ->pageSize)!=0 )
dc30: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  {.      pBt->pag
dc40: 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64  eSize = 0;.#ifnd
dc50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dc60: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
dc70: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
dc80: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
dc90: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
dca0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
dcb0: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
dcc0: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
dcd0: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
dce0: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
dcf0: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
dd00: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
dd10: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
dd20: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
dd30: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
dd40: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
dd50: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
dd60: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
dd70: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
dd80: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
dd90: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
dda0: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
ddb0: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
ddc0: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
ddd0: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
dde0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
ddf0: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
de00: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
de10: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
de20: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
de30: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
de40: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
de50: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
de60: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
de70: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
de80: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
de90: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
dea0: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
deb0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
dec0: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
ded0: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
dee0: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
def0: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
df00: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
df10: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
df20: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
df30: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
df40: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
df50: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
df60: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
df70: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
df80: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
df90: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
dfa0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
dfb0: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
dfc0: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
dfd0: 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
dfe0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
dff0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
e000: 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
e010: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
e020: 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
e030: 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
e040: 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
e050: 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
e060: 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
e070: 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
e080: 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
e090: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
e0a0: 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
e0b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
e0c0: 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
e0d0: 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
e0e0: 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
e0f0: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
e100: 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
e110: 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
e120: 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
e130: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
e140: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
e150: 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  red;.      pBt->
e160: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
e170: 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71  mutexShared = sq
e180: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
e190: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
e1a0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20  TIC_MASTER);.   
e1b0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
e1c0: 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
e1d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
e1e0: 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
e1f0: 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
e200: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
e210: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
e220: 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
e230: 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
e240: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
e250: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e260: 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  M;.          db-
e270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
e280: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  0;.          got
e290: 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
e2a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e2b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
e2c0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
e2d0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
e2e0: 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
e2f0: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e300: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e310: 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
e320: 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
e330: 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
e340: 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
e350: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
e360: 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
e370: 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
e380: 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
e390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e3a0: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
e3b0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
e3c0: 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
e3d0: 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
e3e0: 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
e3f0: 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
e400: 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
e410: 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
e420: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
e430: 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
e440: 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
e450: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
e460: 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
e470: 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
e480: 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
e490: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
e4a0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
e4b0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
e4c0: 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
e4d0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
e4e0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
e4f0: 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
e500: 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
e510: 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
e520: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
e530: 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
e540: 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
e550: 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
e560: 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e  f( p->pBt<pSib->
e570: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
e580: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62   p->pNext = pSib
e590: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  ;.          p->p
e5a0: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  Prev = 0;.      
e5b0: 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20      pSib->pPrev 
e5c0: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = p;.        }el
e5d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68  se{.          wh
e5e0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74  ile( pSib->pNext
e5f0: 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d   && pSib->pNext-
e600: 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20  >pBt<p->pBt ){. 
e610: 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
e620: 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
e630: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
e640: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
e650: 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
e660: 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
e670: 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
e680: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
e690: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
e6a0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
e6b0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
e6c0: 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
e6d0: 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
e6e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
e6f0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
e700: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
e710: 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
e720: 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
e730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e740: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
e750: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
e760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
e770: 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
e780: 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
e790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
e7a0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
e7b0: 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
e7c0: 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  pBtree = 0;.  }.
e7d0: 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
e7e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
e7f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e800: 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
e810: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
e820: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
e830: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
e840: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
e850: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
e860: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
e870: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
e880: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
e890: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
e8a0: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
e8b0: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
e8c0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
e8d0: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
e8e0: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
e8f0: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
e900: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
e910: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
e920: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
e930: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
e940: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
e950: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
e960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e970: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
e980: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
e990: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
e9a0: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
e9b0: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
e9c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e9d0: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
e9e0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e9f0: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
ea00: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
ea10: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
ea20: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
ea30: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
ea40: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
ea50: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
ea60: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
ea70: 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
ea80: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
ea90: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
eaa0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
eab0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
eac0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
ead0: 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
eae0: 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
eaf0: 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
eb00: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
eb10: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
eb20: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
eb30: 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
eb40: 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
eb50: 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
eb60: 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
eb70: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
eb80: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
eb90: 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
eba0: 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
ebb0: 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
ebc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
ebd0: 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
ebe0: 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
ebf0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
ec00: 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
ec10: 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
ec20: 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
ec30: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
ec40: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
ec50: 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
ec60: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
ec70: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
ec80: 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
ec90: 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
eca0: 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
ecb0: 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
ecc0: 28 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a  (pBt) bytes..*/.
ecd0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f  static void allo
ece0: 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74  cateTempSpace(Bt
ecf0: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
ed00: 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70  if( !pBt->pTmpSp
ed10: 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
ed20: 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69  pTmpSpace = sqli
ed30: 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70  te3PageMalloc( p
ed40: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  Bt->pageSize );.
ed50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
ed60: 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
ed70: 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
ed80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
ed90: 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
eda0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73  hared *pBt){.  s
edb0: 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20  qlite3PageFree( 
edc0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
edd0: 0a 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  .  pBt->pTmpSpac
ede0: 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 0;.}../*.** 
edf0: 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61  Close an open da
ee00: 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c  tabase and inval
ee10: 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72  idate all cursor
ee20: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ee30: 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65  3BtreeClose(Btre
ee40: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
ee50: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
ee60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
ee70: 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  r;..  /* Close a
ee80: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
ee90: 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c  d via this handl
eea0: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
eeb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
eec0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
eed0: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
eee0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
eef0: 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  Cur = pBt->pCurs
ef00: 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43 75  or;.  while( pCu
ef10: 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73 6f  r ){.    BtCurso
ef20: 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a  r *pTmp = pCur;.
ef30: 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72 2d      pCur = pCur-
ef40: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20  >pNext;.    if( 
ef50: 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20  pTmp->pBtree==p 
ef60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
ef70: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
ef80: 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  (pTmp);.    }.  
ef90: 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b  }..  /* Rollback
efa0: 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61 6e   any active tran
efb0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65  saction and free
efc0: 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72 75   the handle stru
efd0: 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20  cture..  ** The 
efe0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
eff0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64  treeRollback() d
f000: 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c  rops any table-l
f010: 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20 2a  ocks held by.  *
f020: 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20  * this handle.. 
f030: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
f040: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20  eeRollback(p);. 
f050: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
f060: 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ve(p);..  /* If 
f070: 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
f080: 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e  other outstandin
f090: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
f0a0: 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
f0b0: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c  .  ** structure,
f0c0: 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65   return now. The
f0d0: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
f0e0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
f0f0: 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65  ans .  ** up the
f100: 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20   shared-btree.. 
f110: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
f120: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26  >wantToLock==0 &
f130: 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29  & p->locked==0 )
f140: 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72  ;.  if( !p->shar
f150: 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72  able || removeFr
f160: 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42  omSharingList(pB
f170: 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  t) ){.    /* The
f180: 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65   pBt is no longe
f190: 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67  r on the sharing
f1a0: 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e   list, so we can
f1b0: 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69   access.    ** i
f1c0: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  t without having
f1d0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74   to hold the mut
f1e0: 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
f1f0: 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20  * Clean out and 
f200: 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61  delete the BtSha
f210: 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20  red object..    
f220: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
f230: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
f240: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
f250: 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65  Close(pBt->pPage
f260: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  r);.    if( pBt-
f270: 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20  >xFreeSchema && 
f280: 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a  pBt->pSchema ){.
f290: 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65        pBt->xFree
f2a0: 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68  Schema(pBt->pSch
f2b0: 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ema);.    }.    
f2c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
f2d0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f2e0: 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
f2f0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
f300: 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  free(pBt);.  }..
f310: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f320: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
f330: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
f340: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  ntToLock==0 );. 
f350: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
f360: 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed==0 );.  if( p
f370: 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72  ->pPrev ) p->pPr
f380: 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
f390: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70  Next;.  if( p->p
f3a0: 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d  Next ) p->pNext-
f3b0: 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65  >pPrev = p->pPre
f3c0: 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c  v;.#endif..  sql
f3d0: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
f3e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f3f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
f400: 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74  e the limit on t
f410: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
f420: 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68  es allowed in th
f430: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
f440: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
f450: 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65 73  r of cache pages
f460: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 61   is set to the a
f470: 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65  bsolute.** value
f480: 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49 66 20   of mxPage.  If 
f490: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
f4a0: 76 65 2c 20 74 68 65 20 70 61 67 65 72 20 77 69  ve, the pager wi
f4b0: 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20 61 73  ll.** operate as
f4c0: 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69  ynchronously - i
f4d0: 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20  t will not stop 
f4e0: 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a  to do fsync()s.*
f4f0: 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61 74 61  * to insure data
f500: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
f510: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 20  he disk surface 
f520: 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e  before.** contin
f530: 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63 74 69  uing.  Transacti
f540: 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69  ons still work i
f550: 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73  f synchronous is
f560: 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65   off,.** and the
f570: 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e 6f 74   database cannot
f580: 20 62 65 20 63 6f 72 72 75 70 74 65 64 20 69 66   be corrupted if
f590: 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a   this program.**
f5a0: 20 63 72 61 73 68 65 73 2e 20 20 42 75 74 20 69   crashes.  But i
f5b0: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  f the operating 
f5c0: 73 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f  system crashes o
f5d0: 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e  r there is.** an
f5e0: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 66 61   abrupt power fa
f5f0: 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e 63 68  ilure when synch
f600: 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 20 74  ronous is off, t
f610: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
f620: 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69 6e 20  ould be left in 
f630: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
f640: 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61 62 6c  and unrecoverabl
f650: 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63  e state..** Sync
f660: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79  hronous is on by
f670: 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61 74 61   default so data
f680: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
f690: 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c  is not.** normal
f6a0: 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69  ly a worry..*/.i
f6b0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
f6c0: 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
f6d0: 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
f6e0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
f6f0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
f700: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
f710: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
f720: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
f730: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
f740: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
f750: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
f760: 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
f770: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
f780: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
f790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f7a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
f7b0: 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
f7c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
f7d0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
f7e0: 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
f7f0: 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
f800: 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
f810: 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
f820: 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
f830: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
f840: 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
f850: 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
f860: 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
f870: 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
f880: 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
f890: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
f8a0: 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
f8b0: 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
f8c0: 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
f8d0: 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
f8e0: 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
f8f0: 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
f900: 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
f910: 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
f920: 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
f930: 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
f940: 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
f950: 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
f960: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f970: 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
f980: 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
f990: 72 65 65 53 65 74 53 61 66 65 74 79 4c 65 76 65  reeSetSafetyLeve
f9a0: 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  l(Btree *p, int 
f9b0: 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53  level, int fullS
f9c0: 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ync){.  BtShared
f9d0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
f9e0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
f9f0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
fa00: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
fa10: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
fa20: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
fa30: 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65 76  agerSetSafetyLev
fa40: 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  el(pBt->pPager, 
fa50: 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29  level, fullSync)
fa60: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
fa70: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
fa80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fa90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
faa0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
fab0: 20 67 69 76 65 6e 20 62 74 72 65 65 20 69 73 20   given btree is 
fac0: 73 65 74 20 74 6f 20 73 61 66 65 74 79 20 6c 65  set to safety le
fad0: 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68 65 72  vel 1.  In other
fae0: 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74 75 72  .** words, retur
faf0: 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73 79 6e  n TRUE if no syn
fb00: 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  c() occurs on th
fb10: 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f  e disk files..*/
fb20: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
fb30: 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 42 74  eSyncDisabled(Bt
fb40: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
fb50: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
fb60: 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  t;.  int rc;.  a
fb70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fb80: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
fb90: 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20 20 73  >mutex) );  .  s
fba0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
fbb0: 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
fbc0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
fbd0: 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r );.  rc = sqli
fbe0: 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 70  te3PagerNosync(p
fbf0: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 73  Bt->pPager);.  s
fc00: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
fc10: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
fc20: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
fc30: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  d(SQLITE_OMIT_PA
fc40: 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20  GER_PRAGMAS) || 
fc50: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
fc60: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a  OMIT_VACUUM)./*.
fc70: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65  ** Change the de
fc80: 66 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65  fault pages size
fc90: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
fca0: 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
fcb0: 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f  s per page..** O
fcc0: 72 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  r, if the page s
fcd0: 69 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ize has already 
fce0: 62 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75  been fixed, retu
fcf0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
fd00: 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63  LY .** without c
fd10: 68 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67  hanging anything
fd20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
fd30: 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20   size must be a 
fd40: 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65  power of 2 betwe
fd50: 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36  en 512 and 65536
fd60: 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a  .  If the page.*
fd70: 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20  * size supplied 
fd80: 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68  does not meet th
fd90: 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68  is constraint th
fda0: 65 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  en the page size
fdb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67   is not.** chang
fdc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73  ed..**.** Page s
fdd0: 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61  izes are constra
fde0: 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77  ined to be a pow
fdf0: 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61  er of two so tha
fe00: 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20  t the region.** 
fe10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
fe20: 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f  file used for lo
fe30: 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67  cking (beginning
fe40: 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   at PENDING_BYTE
fe50: 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62  ,.** the first b
fe60: 79 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42  yte past the 1GB
fe70: 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30   boundary, 0x400
fe80: 30 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20  00000) needs to 
fe90: 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20  occur.** at the 
fea0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70  beginning of a p
feb0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  age..**.** If pa
fec0: 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65  rameter nReserve
fed0: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
fee0: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ro, then the num
fef0: 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a  ber of reserved.
ff00: 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ** bytes per pag
ff10: 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e  e is left unchan
ff20: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ged..**.** If th
ff30: 65 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74  e iFix!=0 then t
ff40: 68 65 20 70 61 67 65 53 69 7a 65 46 69 78 65 64  he pageSizeFixed
ff50: 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20   flag is set so 
ff60: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69  that the page si
ff70: 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61  ze.** and autova
ff80: 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f  cuum mode can no
ff90: 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67   longer be chang
ffa0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ffb0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
ffc0: 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
ffd0: 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e   pageSize, int n
ffe0: 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69  Reserve, int iFi
fff0: 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  x){.  int rc = S
10000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
10010 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
10020 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52  Bt;.  assert( nR
10030 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52  eserve>=-1 && nR
10040 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
10050 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10060 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74  er(p);.  if( pBt
10070 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
10080 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
10090 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
100a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
100b0 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69  EADONLY;.  }.  i
100c0 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b  f( nReserve<0 ){
100d0 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20  .    nReserve = 
100e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
100f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
10100 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
10110 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52  Reserve>=0 && nR
10120 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20  eserve<=255 );. 
10130 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35   if( pageSize>=5
10140 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
10150 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
10160 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20  SIZE &&.        
10170 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
10180 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20  geSize)==0 ){.  
10190 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
101a0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
101b0 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d     assert( !pBt-
101c0 3e 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d  >pPage1 && !pBt-
101d0 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20  >pCursor );.    
101e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
101f0 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
10200 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
10210 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  (pBt);.  }.  rc 
10220 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
10230 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
10240 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
10250 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
10260 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  ;.  pBt->usableS
10270 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  ize = pBt->pageS
10280 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65  ize - (u16)nRese
10290 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20  rve;.  if( iFix 
102a0 29 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46  ) pBt->pageSizeF
102b0 69 78 65 64 20 3d 20 31 3b 0a 20 20 73 71 6c 69  ixed = 1;.  sqli
102c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
102d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
102e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
102f0 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66  he currently def
10300 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a  ined page size.*
10310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
10320 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42 74  eeGetPageSize(Bt
10330 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  ree *p){.  retur
10340 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  n p->pBt->pageSi
10350 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ze;.}../*.** Ret
10360 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10370 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
10380 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
10390 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a  very page that.*
103a0 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c  * are intentuall
103b0 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20  y left unused.  
103c0 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73  This is the "res
103d0 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61  erved" space tha
103e0 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65  t is.** sometime
103f0 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73  s used by extens
10400 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
10410 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
10420 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
10430 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
10440 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
10450 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61    n = p->pBt->pa
10460 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d  geSize - p->pBt-
10470 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73  >usableSize;.  s
10480 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10490 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
104a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
104b0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
104c0 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62  ount for a datab
104d0 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ase if mxPage is
104e0 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f   positive..** No
104f0 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
10500 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30  e if mxPage is 0
10510 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   or negative..**
10520 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   Regardless of t
10530 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  he value of mxPa
10540 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d  ge, return the m
10550 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
10560 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
10570 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75  3BtreeMaxPageCou
10580 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  nt(Btree *p, int
10590 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   mxPage){.  int 
105a0 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
105b0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
105c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
105d0 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74  PageCount(p->pBt
105e0 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65  ->pPager, mxPage
105f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10600 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10610 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn n;.}.#endif 
10620 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
10630 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
10640 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
10650 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
10660 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ACUUM) */../*.**
10670 20 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74   Change the 'aut
10680 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72  o-vacuum' proper
10690 74 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ty of the databa
106a0 73 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f  se. If the 'auto
106b0 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d  Vacuum'.** param
106c0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
106d0 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75  , then auto-vacu
106e0 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c  um mode is enabl
106f0 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a  ed. If zero, it.
10700 2a 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20  ** is disabled. 
10710 54 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75  The default valu
10720 65 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76  e for the auto-v
10730 61 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69  acuum property i
10740 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  s .** determined
10750 20 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44   by the SQLITE_D
10760 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
10770 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20  M macro..*/.int 
10780 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41  sqlite3BtreeSetA
10790 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
107a0 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75  *p, int autoVacu
107b0 75 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  um){.#ifdef SQLI
107c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
107d0 55 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  UM.  return SQLI
107e0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c  TE_READONLY;.#el
107f0 73 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  se.  BtShared *p
10800 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
10810 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10820 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38  K;.  u8 av = (u8
10830 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20  )autoVacuum;..  
10840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10850 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r(p);.  if( pBt-
10860 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 26  >pageSizeFixed &
10870 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74  & (av ?1:0)!=pBt
10880 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
10890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
108a0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
108b0 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
108c0 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30  Vacuum = av ?1:0
108d0 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
108e0 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31  acuum = av==2 ?1
108f0 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  :0;.  }.  sqlite
10900 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
10910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
10920 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
10930 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
10940 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75   the 'auto-vacuu
10950 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20  m' property. If 
10960 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a  auto-vacuum is .
10970 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20  ** enabled 1 is 
10980 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
10990 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ise 0..*/.int sq
109a0 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74  lite3BtreeGetAut
109b0 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
109c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
109d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
109e0 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f  .  return BTREE_
109f0 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b  AUTOVACUUM_NONE;
10a00 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
10a10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
10a20 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
10a30 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  (.    (!p->pBt->
10a40 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45  autoVacuum)?BTRE
10a50 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
10a60 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d  E:.    (!p->pBt-
10a70 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52  >incrVacuum)?BTR
10a80 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55  EE_AUTOVACUUM_FU
10a90 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55  LL:.    BTREE_AU
10aa0 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20  TOVACUUM_INCR.  
10ab0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
10ac0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
10ad0 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
10ae0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72  .../*.** Get a r
10af0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67  eference to pPag
10b00 65 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  e1 of the databa
10b10 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77  se file.  This w
10b20 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75  ill.** also acqu
10b30 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f  ire a readlock o
10b40 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a  n that file..**.
10b50 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
10b60 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
10b70 65 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c  ess.  If the fil
10b80 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65  e is not a.** we
10b90 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
10ba0 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51  se file, then SQ
10bb0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20  LITE_CORRUPT is 
10bc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c  returned..** SQL
10bd0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
10be0 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61  rned if the data
10bf0 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20  base is locked. 
10c00 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
10c10 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
10c20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
10c30 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mory. .*/.static
10c40 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42   int lockBtree(B
10c50 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
10c60 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
10c70 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e  ge *pPage1;.  in
10c80 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
10c90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
10ca0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
10cb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
10cc0 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
10cd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
10ce0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10cf0 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
10d00 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10d10 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
10d20 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
10d30 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
10d40 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
10d50 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
10d60 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
10d70 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
10d80 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  . .  */.  rc = s
10d90 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
10da0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10db0 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28  , &nPage);.  if(
10dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10dd0 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31  {.    goto page1
10de0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10df0 7d 65 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e  }else if( nPage>
10e00 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67  0 ){.    int pag
10e10 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75  eSize;.    int u
10e20 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
10e30 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
10e40 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
10e50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
10e60 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  ;.    if( memcmp
10e70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
10e80 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
10e90 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
10ea0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
10eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65    }.    if( page
10ec0 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20  1[18]>1 ){.     
10ed0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d   pBt->readOnly =
10ee0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
10ef0 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
10f00 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
10f10 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
10f20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
10f30 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65   maximum embedde
10f40 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20  d fraction must 
10f50 62 65 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20  be exactly 25%. 
10f60 20 41 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d   And the minimum
10f70 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64  .    ** embedded
10f80 20 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62   fraction must b
10f90 65 20 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68  e 12.5% for both
10fa0 20 6c 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e   leaf-data and n
10fb0 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20  on-leaf-data..  
10fc0 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
10fd0 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
10fe0 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
10ff0 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
11000 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
11010 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
11020 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
11030 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
11040 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
11050 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
11060 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
11070 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
11080 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
11090 20 7d 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20   }.    pageSize 
110a0 3d 20 67 65 74 32 62 79 74 65 28 26 70 61 67 65  = get2byte(&page
110b0 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  1[16]);.    if( 
110c0 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61  ((pageSize-1)&pa
110d0 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61  geSize)!=0 || pa
110e0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20  geSize<512 ||.  
110f0 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41        (SQLITE_MA
11100 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36  X_PAGE_SIZE<3276
11110 38 20 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51  8 && pageSize>SQ
11120 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
11130 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ZE).    ){.     
11140 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
11150 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
11160 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
11170 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
11180 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
11190 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
111a0 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70  1[20];.    if( p
111b0 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
111c0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
111d0 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
111e0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
111f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
11200 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
11210 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
11220 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
11230 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
11240 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
11250 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
11260 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
11270 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
11280 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
11290 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
112a0 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
112b0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
112c0 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
112d0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
112e0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
112f0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
11300 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
11310 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
11320 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11330 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
11340 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
11350 20 28 75 31 36 29 75 73 61 62 6c 65 53 69 7a 65   (u16)usableSize
11360 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
11370 65 53 69 7a 65 20 3d 20 28 75 31 36 29 70 61 67  eSize = (u16)pag
11380 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
11390 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
113a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
113b0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
113c0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
113d0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
113e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
113f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11400 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
11410 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
11420 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 70 61  if( rc ) goto pa
11430 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
11440 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11450 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
11460 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
11470 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
11480 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
11490 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
114a0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
114b0 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a   (u16)pageSize;.
114c0 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
114d0 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
114e0 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53  eSize;.#ifndef S
114f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
11500 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61  ACUUM.    pBt->a
11510 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74  utoVacuum = (get
11520 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
11530 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
11540 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
11550 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
11560 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  age1[36 + 7*4])?
11570 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  1:0);.#endif.  }
11580 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20  ..  /* maxLocal 
11590 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
115a0 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64  mount of payload
115b0 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c   to store locall
115c0 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c  y for.  ** a cel
115d0 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74  l.  Make sure it
115e0 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68   is small enough
115f0 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73   so that at leas
11600 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a  t minFanout.  **
11610 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20   cells can will 
11620 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e  fit on one page.
11630 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30    We assume a 10
11640 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65  -byte page heade
11650 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20  r..  ** Besides 
11660 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65  the payload, the
11670 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65   cell must store
11680 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74  :.  **     2-byt
11690 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
116a0 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34   cell.  **     4
116b0 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e  -byte child poin
116c0 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62  ter.  **     9-b
116d0 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20  yte nKey value. 
116e0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e   **     4-byte n
116f0 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20  Data value.  ** 
11700 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66      4-byte overf
11710 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
11720 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20  .  ** So a cell 
11730 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d  consists of a 2-
11740 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20 68  byte poiner, a h
11750 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
11760 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
11770 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
11780 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
11790 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
117a0 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
117b0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
117c0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
117d0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
117e0 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
117f0 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32  e-12)*64/255 - 2
11800 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  3;.  pBt->minLoc
11810 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
11820 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
11830 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 61   - 23;.  pBt->ma
11840 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73 61  xLeaf = pBt->usa
11850 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20 20  bleSize - 35;.  
11860 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
11870 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
11880 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 3b  12)*32/255 - 23;
11890 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
118a0 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
118b0 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
118c0 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
118d0 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72  e1 = pPage1;.  r
118e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
118f0 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
11900 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
11910 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
11920 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
11930 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11940 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11950 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63  e works like loc
11960 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74 20  kBtree() except 
11970 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76  that it also inv
11980 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79  okes the.** busy
11990 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
119a0 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65  re is lock conte
119b0 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ntion..*/.static
119c0 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69   int lockBtreeWi
119d0 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a 70  thRetry(Btree *p
119e0 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Ref){.  int rc =
119f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
11a00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
11a10 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52  reeHoldsMutex(pR
11a20 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65  ef) );.  if( pRe
11a30 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  f->inTrans==TRAN
11a40 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38  S_NONE ){.    u8
11a50 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d   inTransaction =
11a60 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
11a70 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62  ansaction;.    b
11a80 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
11a90 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ef);.    rc = sq
11aa0 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
11ab0 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20  rans(pRef, 0);. 
11ac0 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e     pRef->pBt->in
11ad0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e  Transaction = in
11ae0 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20  Transaction;.   
11af0 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d   pRef->inTrans =
11b00 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
11b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66  OK ){.      pRef
11b30 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ->pBt->nTransact
11b40 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  ion--;.    }.   
11b50 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
11b60 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  pRef);.  }.  ret
11b70 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20  urn rc;.}.      
11b80 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72   ../*.** If ther
11b90 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
11ba0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
11bb0 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
11bc0 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
11bd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
11be0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
11bf0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
11c00 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
11c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
11c20 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
11c30 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
11c40 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
11c50 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
11c60 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
11c70 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
11c80 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
11c90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
11ca0 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
11cb0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
11cc0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
11cd0 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
11ce0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
11cf0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
11d00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11d10 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
11d20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11d30 3e 70 43 75 72 73 6f 72 3d 3d 30 20 7c 7c 20 70  >pCursor==0 || p
11d40 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
11d50 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
11d60 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
11d70 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
11d80 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
11d90 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  ge1!=0 ){.    as
11da0 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
11db0 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  1->aData );.    
11dc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11dd0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74  agerRefcount(pBt
11de0 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a  ->pPager)==1 );.
11df0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
11e00 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
11e10 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
11e20 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
11e30 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20      pBt->pPage1 
11e40 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
11e50 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64  * Create a new d
11e60 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69  atabase by initi
11e70 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73  alizing the firs
11e80 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  t page of the.**
11e90 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11ea0 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
11eb0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
11ec0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
11ed0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11ee0 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
11ef0 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a  ;.  int nPage;..
11f00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11f10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
11f20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
11f30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
11f40 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
11f50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
11f60 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11f70 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b  OK || nPage>0 ){
11f80 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11f90 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
11fa0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
11fb0 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
11fc0 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
11fd0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11fe0 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
11ff0 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
12000 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12010 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
12020 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
12030 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
12040 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
12050 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
12060 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32  r)==16 );.  put2
12070 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20  byte(&data[16], 
12080 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
12090 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
120a0 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
120b0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
120c0 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
120d0 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
120e0 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
120f0 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
12100 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
12110 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
12120 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
12130 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
12140 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
12150 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
12160 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
12170 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
12180 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
12190 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
121a0 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
121b0 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
121c0 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
121d0 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
121e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
121f0 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
12200 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
12210 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
12220 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
12230 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
12240 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
12250 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
12260 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
12270 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
12280 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
12290 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
122a0 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
122b0 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
122c0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
122d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
122e0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
122f0 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
12300 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
12310 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
12320 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
12330 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
12340 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
12350 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
12360 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
12370 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
12380 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
12390 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
123a0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
123b0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
123c0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
123d0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
123e0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
123f0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
12400 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
12410 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
12420 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
12430 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
12440 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
12450 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
12460 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
12470 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
12480 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
12490 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
124a0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
124b0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
124c0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
124d0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
124e0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
124f0 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
12500 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
12510 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
12520 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
12530 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
12540 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
12550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
12560 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
12570 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
12580 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
12590 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
125a0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
125b0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
125c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
125d0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
125e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
125f0 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
12600 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
12610 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
12620 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
12630 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
12640 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
12650 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
12660 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
12670 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
12680 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
12690 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
126a0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
126b0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
126c0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
126d0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
126e0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
126f0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
12700 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
12710 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
12720 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
12730 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
12740 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
12750 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
12760 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
12770 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
12780 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
12790 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
127a0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
127b0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
127c0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
127d0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
127e0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
127f0 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
12800 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
12810 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
12820 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
12830 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
12840 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
12850 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
12860 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
12870 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
12880 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
12890 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
128a0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
128b0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
128c0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
128d0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
128e0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
128f0 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
12900 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
12910 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
12920 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
12930 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
12940 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
12950 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
12960 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
12970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12980 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
12990 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
129a0 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ag){.  sqlite3 *
129b0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74  pBlock = 0;.  Bt
129c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
129d0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
129e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
129f0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12a00 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  (p);.  btreeInte
12a10 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12a20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
12a30 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
12a40 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
12a50 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
12a60 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
12a70 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
12a80 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
12a90 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
12aa0 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
12ab0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
12ac0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12ad0 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
12ae0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
12af0 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
12b00 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
12b10 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
12b20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
12b30 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
12b40 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
12b50 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
12b60 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
12b70 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
12b80 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12b90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
12ba0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
12bb0 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  un;.  }..#ifndef
12bc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
12bd0 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 20 49  RED_CACHE.  /* I
12be0 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61  f another databa
12bf0 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c  se handle has al
12c00 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77  ready opened a w
12c10 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12c20 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73   .  ** on this s
12c30 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
12c40 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
12c50 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
12c60 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71  tion is.  ** req
12c70 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53  uested, return S
12c80 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20  QLITE_LOCKED..  
12c90 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c 61 67  */.  if( (wrflag
12ca0 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
12cb0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
12cc0 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69 73 50  ITE) || pBt->isP
12cd0 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20 70 42  ending ){.    pB
12ce0 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
12cf0 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
12d00 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
12d10 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
12d20 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
12d30 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
12d40 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
12d50 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
12d60 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
12d70 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
12d80 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
12d90 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
12da0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12db0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
12dc0 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
12dd0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
12de0 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
12df0 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
12e00 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
12e10 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
12e20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
12e30 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
12e40 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
12e50 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
12e60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
12e70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
12e80 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
12e90 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
12ea0 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
12eb0 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
12ec0 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
12ed0 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
12ee0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12ef0 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
12f00 64 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  d. */.  if( SQLI
12f10 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 71 75 65  TE_OK!=(rc = que
12f20 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
12f30 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
12f40 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
12f50 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  )) ){.    goto t
12f60 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
12f70 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
12f80 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
12f90 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
12fa0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
12fb0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
12fc0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
12fd0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
12fe0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
12ff0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
13000 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
13010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
13020 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
13030 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
13040 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
13050 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
13060 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
13070 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
13080 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
13090 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
130a0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
130b0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
130c0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
130d0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
130e0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
130f0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
13100 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
13110 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
13120 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
13130 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
13140 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
13150 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
13160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
13170 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
13180 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
13190 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
131a0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
131b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
131c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
131d0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
131e0 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
131f0 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
13200 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
13210 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
13220 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13230 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
13240 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
13250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13260 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
13270 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13280 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
13290 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
132a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
132b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
132c0 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e  Y && pBt->inTran
132d0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e  saction==TRANS_N
132e0 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  ONE &&.         
132f0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
13300 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a  Handler(pBt) );.
13310 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
13330 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13340 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
13350 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
13360 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  n++;.#ifndef SQL
13370 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13380 43 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20  CACHE.      if( 
13390 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 09  p->sharable ){..
133a0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e  assert( p->lock.
133b0 70 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e  pBtree==p && p->
133c0 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29  lock.iTable==1 )
133d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
133e0 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c  k.eLock = READ_L
133f0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OCK;.        p->
13400 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74  lock.pNext = pBt
13410 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  ->pLock;.       
13420 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70   pBt->pLock = &p
13430 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a  ->lock;.      }.
13440 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
13450 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
13460 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
13470 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
13480 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
13490 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
134a0 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
134b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
134c0 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
134d0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
134e0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
134f0 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
13500 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73  flag ){.      as
13510 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
13520 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
13530 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
13540 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c       pBt->isExcl
13550 75 73 69 76 65 20 3d 20 28 75 38 29 28 77 72 66  usive = (u8)(wrf
13560 6c 61 67 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65  lag>1);.    }.#e
13570 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73  ndif.  }...trans
13580 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63  _begun:.  if( rc
13590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
135a0 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20  rflag ){.    /* 
135b0 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
135c0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
135d0 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
135e0 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
135f0 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f    ** open savepo
13600 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63  ints. If the sec
13610 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  ond parameter is
13620 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20   greater than 0 
13630 61 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  and.    ** the s
13640 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
13650 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
13660 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
13670 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
13680 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13690 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
136a0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
136b0 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  er, p->db->nSave
136c0 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  point);.  }..  b
136d0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
136e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
136f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13700 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
13710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13720 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20  TOVACUUM../*.** 
13730 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
13740 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
13750 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  all children of 
13760 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f  page pPage. Also
13770 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f  , if.** pPage co
13780 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61  ntains cells tha
13790 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
137a0 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74  low pages, set t
137b0 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61  he pointer.** ma
137c0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  p entries for th
137d0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
137e0 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61   as well..*/.sta
137f0 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64  tic int setChild
13800 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20  Ptrmaps(MemPage 
13810 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69  *pPage){.  int i
13820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13840 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c   Counter variabl
13850 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
13860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13880 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
13890 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20  page pPage */.  
138a0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
138b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138c0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
138d0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
138e0 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
138f0 74 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72  t;.  u8 isInitOr
13900 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
13910 69 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  it;.  Pgno pgno 
13920 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
13930 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
13940 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
13950 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
13960 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13970 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
13980 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
13990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
139a0 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
139b0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
139c0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
139d0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
139e0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
139f0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
13a00 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
13a10 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63  age, i);..    rc
13a20 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
13a30 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
13a40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
13a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13a60 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
13a70 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
13a80 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 70 50    }..    if( !pP
13a90 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
13aa0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
13ab0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
13ac0 6c 6c 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ll);.      rc = 
13ad0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
13ae0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
13af0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20  _BTREE, pgno);. 
13b00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13b10 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65  ITE_OK ) goto se
13b20 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
13b30 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
13b40 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
13b50 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
13b60 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
13b70 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
13b80 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
13b90 65 74 2b 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d  et+8]);.    rc =
13ba0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
13bb0 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
13bc0 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a  P_BTREE, pgno);.
13bd0 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
13be0 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
13bf0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
13c00 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
13c10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13c20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
13c30 67 65 2c 20 77 68 69 63 68 20 69 73 20 67 75 61  ge, which is gua
13c40 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
13c50 62 74 72 65 65 20 70 61 67 65 2c 20 6e 6f 74 20  btree page, not 
13c60 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  an overflow.** p
13c70 61 67 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  age, is a pointe
13c80 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e  r to page iFrom.
13c90 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
13ca0 6e 74 65 72 20 73 6f 20 74 68 61 74 20 69 74 20  nter so that it 
13cb0 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f  points to.** iTo
13cc0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
13cd0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
13ce0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
13cf0 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  to be modified, 
13d00 61 73 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a  as .** follows:.
13d10 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
13d20 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
13d30 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
13d40 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
13d50 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
13d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d70 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
13d80 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
13d90 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
13da0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
13db0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
13dc0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
13dd0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
13de0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
13df0 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
13e00 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
13e10 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
13e20 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
13e30 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
13e40 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
13e50 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
13e60 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
13e70 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
13e80 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
13e90 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
13ea0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
13eb0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
13ec0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
13ed0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
13ee0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
13ef0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13f00 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
13f10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
13f20 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13f30 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
13f40 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
13f50 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
13f60 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
13f70 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
13f80 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
13f90 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
13fa0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
13fb0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
13fc0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
13fd0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
13fe0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
13ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14000 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
14010 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
14020 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
14030 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
14040 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
14050 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
14060 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
14070 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69  nCell;..    sqli
14080 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
14090 28 70 50 61 67 65 29 3b 0a 20 20 20 20 6e 43 65  (pPage);.    nCe
140a0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
140b0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
140c0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
140d0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
140e0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
140f0 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
14100 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
14110 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
14120 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
14130 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14140 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
14150 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
14160 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
14170 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
14180 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  low ){.         
14190 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
141a0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
141b0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a  .iOverflow]) ){.
141c0 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34              put4
141d0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
141e0 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f  .iOverflow], iTo
141f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  );.            b
14200 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
14210 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
14220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14230 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43   if( get4byte(pC
14240 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  ell)==iFrom ){. 
14250 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
14260 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20  e(pCell, iTo);. 
14270 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
14280 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14290 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
142a0 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20  f( i==nCell ){. 
142b0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d       if( eType!=
142c0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
142d0 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62  .          get4b
142e0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
142f0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
14300 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b  et+8])!=iFrom ){
14310 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
14320 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
14330 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
14340 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
14350 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
14360 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69  >hdrOffset+8], i
14370 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  To);.    }..    
14380 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
14390 69 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a  isInitOrig;.  }.
143a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
143b0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
143c0 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
143d0 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
143e0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
143f0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
14400 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
14410 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
14420 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
14430 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14440 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20  relocatePage(.  
14450 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
14460 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
14470 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
14480 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20 20  pDbPage,        
14490 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20  /* Open page to 
144a0 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79  move */.  u8 eTy
144b0 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
144c0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
144d0 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20 66  p 'type' entry f
144e0 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  or pDbPage */.  
144f0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20  Pgno iPtrPage,  
14500 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
14510 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f  ter map 'page-no
14520 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
14530 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46  age */.  Pgno iF
14540 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20 20  reePage,        
14550 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f    /* The locatio
14560 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67  n to move pDbPag
14570 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73  e to */.  int is
14580 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50  Commit.){.  MemP
14590 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
145a0 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
145b0 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
145c0 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
145d0 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
145e0 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
145f0 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
14600 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
14610 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
14620 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
14630 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
14640 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
14650 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
14660 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
14670 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
14680 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
14690 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
146a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
146b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
146c0 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
146d0 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
146e0 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
146f0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
14700 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
14710 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
14720 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
14730 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
14740 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
14750 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
14760 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
14770 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
14780 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
14790 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
147a0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
147b0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
147c0 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
147d0 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
147e0 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
147f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
14810 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
14820 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
14830 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
14840 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
14850 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
14860 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
14870 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
14880 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
14890 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
148a0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
148b0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
148c0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
148d0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
148e0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
148f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
14900 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
14910 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
14920 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
14930 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
14940 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
14950 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
14960 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
14970 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
14980 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
14990 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
149a0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
149b0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
149c0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
149d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
149e0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
149f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
14a00 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
14a10 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
14a20 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
14a30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14a40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14a50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
14a60 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
14a70 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
14a80 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
14a90 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
14aa0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
14ab0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
14ac0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
14ad0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
14ae0 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
14af0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14b00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
14b10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
14b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14b30 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
14b40 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
14b50 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
14b60 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
14b70 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
14b80 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
14b90 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
14ba0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
14bb0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
14bc0 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
14bd0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
14be0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
14bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
14c00 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
14c10 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
14c20 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
14c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14c40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
14c50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
14c60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
14c70 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
14c80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
14c90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14ca0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
14cb0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
14cc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14cd0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
14ce0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
14cf0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
14d00 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
14d10 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
14d20 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
14d30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
14d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14d50 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
14d60 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
14d70 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
14d80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
14da0 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
14db0 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
14dc0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
14dd0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
14de0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
14df0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
14e00 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
14e10 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
14e20 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
14e30 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
14e40 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
14e50 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
14e60 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49  ,.** return SQLI
14e70 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
14e80 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
14e90 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
14ea0 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63  no.** point in c
14eb0 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63  alling this func
14ec0 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74  tion again), ret
14ed0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
14ee0 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63  .**.** More spec
14ef0 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75 6e  ificly, this fun
14f00 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
14f10 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
14f20 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 73  e .** database s
14f30 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  o that the last 
14f40 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
14f50 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
14f60 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e.** is no longe
14f70 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  r in use..**.** 
14f80 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72 61  If the nFin para
14f90 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
14fa0 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  o, the implement
14fb0 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a  ation assumes.**
14fc0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
14fd0 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69   will keep calli
14fe0 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  ng incrVacuumSte
14ff0 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20  p() until.** it 
15000 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
15010 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c  ONE or an error,
15020 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20 69   and that nFin i
15030 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
15040 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61 74  of pages the dat
15050 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
15060 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74 68  contain after th
15070 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  is .** process i
15080 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73  s complete..*/.s
15090 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61  tatic int incrVa
150a0 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65  cuumStep(BtShare
150b0 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69  d *pBt, Pgno nFi
150c0 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 29  n, Pgno iLastPg)
150d0 7b 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69  {.  Pgno nFreeLi
150e0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
150f0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
15100 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72   still on the fr
15110 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73  ee-list */..  as
15120 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15130 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
15140 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
15150 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
15160 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
15170 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
15180 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
15190 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
151a0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
151b0 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20 65  int rc;.    u8 e
151c0 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69  Type;.    Pgno i
151d0 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46  PtrPage;..    nF
151e0 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62 79  reeList = get4by
151f0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
15200 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
15210 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d   if( nFreeList==
15220 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
15230 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
15240 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70     }..    rc = p
15250 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 4c  trmapGet(pBt, iL
15260 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c 20 26  astPg, &eType, &
15270 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  iPtrPage);.    i
15280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15290 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
152a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
152b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
152c0 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
152d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
152e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
152f0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 65 54     }..    if( eT
15300 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
15310 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 69 66  PAGE ){.      if
15320 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  ( nFin==0 ){.   
15330 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
15340 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
15350 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
15360 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
15370 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
15380 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e 6f 6e  * if nFin is non
15390 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
153a0 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
153b0 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
153c0 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
153d0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
153e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
153f0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
15400 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
15410 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
15420 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
15430 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
15440 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
15450 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
15460 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
15470 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
15480 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
15490 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
154a0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
154b0 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31 29 3b  Pg, iLastPg, 1);
154c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
154d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
154e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
154f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15500 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
15510 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b  eePg==iLastPg );
15520 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
15530 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
15540 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
15550 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69  e {.      Pgno i
15560 46 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20  FreePg;         
15570 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
15580 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76  free page to mov
15590 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a  e pLastPg to */.
155a0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
155b0 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20 20 72  LastPg;..      r
155c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
155d0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
155e0 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
155f0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
15600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15610 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
15620 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15630 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73 20 7a   /* If nFin is z
15640 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72  ero, this loop r
15650 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  uns exactly once
15660 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50   and page pLastP
15670 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77  g.      ** is sw
15680 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20 66  apped with the f
15690 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20 70  irst free page p
156a0 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72  ulled off the fr
156b0 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a  ee list..      *
156c0 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68  *.      ** On th
156d0 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
156e0 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74 65 72   nFin is greater
156f0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
15700 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
15710 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
15720 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
15730 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
15740 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
15750 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
15760 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
15770 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20 7b 0a    */.      do {.
15780 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20          MemPage 
15790 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20  *pFreePg;.      
157a0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
157b0 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
157c0 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67  FreePg, &iFreePg
157d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
157e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
157f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15800 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
15810 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
15820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15830 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
15840 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
15850 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
15860 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46 72 65   nFin!=0 && iFre
15870 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
15880 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
15890 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
158a0 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 73     .      rc = s
158b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
158c0 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50 61 67  (pLastPg->pDbPag
158d0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
158e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
158f0 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f         rc = relo
15900 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c  catePage(pBt, pL
15910 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50  astPg, eType, iP
15920 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c  trPage, iFreePg,
15930 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20 20 20 20   nFin!=0);.     
15940 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65   }.      release
15950 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
15960 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15970 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15990 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
159a0 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
159b0 0a 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a  .    iLastPg--;.
159c0 20 20 20 20 77 68 69 6c 65 28 20 69 4c 61 73 74      while( iLast
159d0 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg==PENDING_BYTE
159e0 5f 50 41 47 45 28 70 42 74 29 7c 7c 50 54 52 4d  _PAGE(pBt)||PTRM
159f0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
15a00 4c 61 73 74 50 67 29 20 29 7b 0a 20 20 20 20 20  LastPg) ){.     
15a10 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
15a20 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
15a30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   ){.        MemP
15a40 61 67 65 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  age *pPg;.      
15a50 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
15a60 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
15a70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 50  Bt, iLastPg, &pP
15a80 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 0);.        i
15a90 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
15ab0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
15ac0 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
15ad0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
15ae0 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b  e(pPg->pDbPage);
15af0 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
15b00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
15b10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15b30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
15b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15b50 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
15b60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
15b70 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
15b80 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
15b90 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
15ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15bb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
15bc0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
15bd0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
15be0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
15bf0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
15c00 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
15c10 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
15c20 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
15c30 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
15c40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
15c50 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
15c60 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
15c70 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
15c80 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
15c90 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
15ca0 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
15cb0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
15cc0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
15cd0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
15ce0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
15cf0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
15d00 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
15d10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15d20 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
15d30 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
15d40 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
15d50 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
15d60 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15d70 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
15d80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
15d90 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26  n==TRANS_WRITE &
15da0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
15db0 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
15dc0 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63  f( !pBt->autoVac
15dd0 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  uum ){.    rc = 
15de0 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
15df0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69  else{.    invali
15e00 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
15e10 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20 72  ache(pBt);.    r
15e20 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
15e30 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67 65 72  ep(pBt, 0, pager
15e40 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 29 3b  Pagecount(pBt));
15e50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
15e60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15e70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15e80 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
15e90 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
15ea0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
15eb0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
15ec0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
15ed0 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
15ee0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
15ef0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
15f00 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
15f10 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
15f20 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
15f30 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15f40 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15f50 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
15f60 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
15f70 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
15f80 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
15f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15fa0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
15fb0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
15fc0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
15fd0 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
15fe0 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
15ff0 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
16000 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
16010 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
16020 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
16030 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
16040 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
16050 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
16060 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
16070 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
16080 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  );..  assert( sq
16090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
160a0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
160b0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
160c0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
160d0 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
160e0 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
160f0 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
16100 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
16110 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e 6f 20   nFin;.    Pgno 
16120 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e 6f 20  nFree;.    Pgno 
16130 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50 67 6e  nPtrmap;.    Pgn
16140 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63 6f 6e  o iFree;.    con
16150 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42  st int pgsz = pB
16160 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  t->pageSize;.   
16170 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 70 61   Pgno nOrig = pa
16180 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
16190 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54 52 4d  );..    if( PTRM
161a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
161b0 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
161c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
161d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
161e0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
161f0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
16200 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
16210 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
16220 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
16230 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
16240 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
16250 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
16260 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
16270 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
16280 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
16290 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
162a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
162b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
162c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
162d0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
162e0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
162f0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
16300 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
16310 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
16320 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
16330 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
16340 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20  sz/5);.    nFin 
16350 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
16360 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
16370 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
16380 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16390 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
163a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
163b0 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a  {.      nFin--;.
163c0 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
163d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
163e0 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
163f0 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
16400 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
16410 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 7d     nFin--;.    }
16420 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
16430 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
16440 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
16450 3b 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65  ;..    for(iFree
16460 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
16470 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
16480 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
16490 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
164a0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
164b0 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20  in, iFree);.    
164c0 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
164d0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
164e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
164f0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
16500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16510 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
16520 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
16530 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
16540 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
16550 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
16560 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
16570 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
16580 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
16590 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
165a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
165b0 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
165c0 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
165d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
165e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
165f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
16600 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
16610 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
16620 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
16630 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
16640 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
16650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16660 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53  else /* ifndef S
16670 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
16680 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e  ACUUM */.# defin
16690 65 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  e setChildPtrmap
166a0 73 28 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23  s(x) SQLITE_OK.#
166b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
166c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
166d0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 6f  he first phase o
166e0 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f  f a two-phase co
166f0 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74  mmit.  This rout
16700 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20  ine.** causes a 
16710 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16720 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 28   to be created (
16730 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61  if it does not a
16740 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a  lready exist).**
16750 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77   and populated w
16760 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72  ith enough infor
16770 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69  mation so that i
16780 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f  f a power loss o
16790 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74  ccurs.** the dat
167a0 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65 73  abase can be res
167b0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
167c0 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70  ginal state by p
167d0 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74  laying back.** t
167e0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  he journal.  The
167f0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  n the contents o
16800 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72  f the journal ar
16810 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f  e flushed out to
16820 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41  .** the disk.  A
16830 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c  fter the journal
16840 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78   is safely on ox
16850 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73  ide, the changes
16860 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   to the.** datab
16870 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ase are written 
16880 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
16890 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68  e file and flush
168a0 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20  ed to oxide..** 
168b0 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
168c0 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c  is call, the rol
168d0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74  lback journal st
168e0 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68  ill exists on th
168f0 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65  e.** disk and we
16900 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69   are still holdi
16910 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f  ng all locks, so
16920 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16930 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d   has not.** comm
16940 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69  itted.  See sqli
16950 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
16960 61 73 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65  aseTwo() for the
16970 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66   second phase of
16980 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70   the.** commit p
16990 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  rocess..**.** Th
169a0 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
169b0 6f 70 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74  op if no write-t
169c0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
169d0 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f  rrently active o
169e0 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  n pBt..**.** Oth
169f0 65 72 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65  erwise, sync the
16a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
16a10 6f 72 20 74 68 65 20 62 74 72 65 65 20 70 42 74  or the btree pBt
16a20 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
16a30 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20   to.** the name 
16a40 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
16a50 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
16a60 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
16a70 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69  into the.** indi
16a80 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66  vidual journal f
16a90 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c  ile, or is NULL,
16aa0 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d   indicating no m
16ab0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
16ac0 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64  le .** (single d
16ad0 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
16ae0 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ion)..**.** When
16af0 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c   this is called,
16b00 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
16b10 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  nal should alrea
16b20 64 79 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  dy have been.** 
16b30 63 72 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74  created, populat
16b40 65 64 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75  ed with this jou
16b50 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64  rnal pointer and
16b60 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
16b70 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73  .**.** Once this
16b80 20 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20   is routine has 
16b90 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e  returned, the on
16ba0 6c 79 20 74 68 69 6e 67 20 72 65 71 75 69 72 65  ly thing require
16bb0 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74  d to commit.** t
16bc0 68 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  he write-transac
16bd0 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61  tion for this da
16be0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 74  tabase file is t
16bf0 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
16c00 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rnal..*/.int sql
16c10 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
16c20 68 61 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70  haseOne(Btree *p
16c30 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
16c40 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
16c50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16c60 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
16c70 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
16c80 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
16c90 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73   = p->pBt;.    s
16ca0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16cb0 28 70 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  (p);.#ifndef SQL
16cc0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
16cd0 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d  UUM.    if( pBt-
16ce0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16cf0 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61       rc = autoVa
16d00 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b  cuumCommit(pBt);
16d10 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16d20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16d30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16d40 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
16d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
16d60 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
16d70 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
16d80 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
16d90 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
16da0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
16db0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
16dc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
16dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16de0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16df0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
16e00 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
16e10 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
16e20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
16e30 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
16e40 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
16e50 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
16e60 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
16e70 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
16e80 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
16e90 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
16ea0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 3b   BtCursor *pCsr;
16eb0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16ec0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
16ed0 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  x(p) );..  /* Se
16ee0 61 72 63 68 20 66 6f 72 20 61 20 63 75 72 73 6f  arch for a curso
16ef0 72 20 68 65 6c 64 20 6f 70 65 6e 20 62 79 20 74  r held open by t
16f00 68 69 73 20 62 2d 74 72 65 65 20 63 6f 6e 6e 65  his b-tree conne
16f10 63 74 69 6f 6e 2e 20 49 66 20 6f 6e 65 20 65 78  ction. If one ex
16f20 69 73 74 73 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  ists,.  ** then 
16f30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16f40 77 69 6c 6c 20 62 65 20 64 6f 77 6e 67 72 61 64  will be downgrad
16f50 65 64 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c  ed to a read-onl
16f60 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  y transaction.  
16f70 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 61 63  ** instead of ac
16f80 74 75 61 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  tually concluded
16f90 2e 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63  . A subsequent c
16fa0 61 6c 6c 20 74 6f 20 43 6f 6d 6d 69 74 50 68 61  all to CommitPha
16fb0 73 65 54 77 6f 28 29 20 0a 20 20 2a 2a 20 6f 72  seTwo() .  ** or
16fc0 20 52 6f 6c 6c 62 61 63 6b 28 29 20 77 69 6c 6c   Rollback() will
16fd0 20 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e   finish the tran
16fe0 73 61 63 74 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f  saction and unlo
16ff0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ck the database.
17000 20 20 2a 2f 0a 20 20 66 6f 72 28 70 43 73 72 3d    */.  for(pCsr=
17010 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
17020 73 72 20 26 26 20 70 43 73 72 2d 3e 70 42 74 72  sr && pCsr->pBtr
17030 65 65 21 3d 70 3b 20 70 43 73 72 3d 70 43 73 72  ee!=p; pCsr=pCsr
17040 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 61 73 73 65  ->pNext);.  asse
17050 72 74 28 20 70 43 73 72 3d 3d 30 20 7c 7c 20 70  rt( pCsr==0 || p
17060 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f  ->inTrans>TRANS_
17070 4e 4f 4e 45 20 29 3b 0a 0a 20 20 62 74 72 65 65  NONE );..  btree
17080 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
17090 70 42 74 29 3b 0a 20 20 69 66 28 20 70 43 73 72  pBt);.  if( pCsr
170a0 20 29 7b 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   ){.    downgrad
170b0 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
170c0 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
170d0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
170e0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
170f0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
17100 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
17110 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
17120 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
17130 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
17140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
17150 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
17160 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
17170 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
17180 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
17190 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
171a0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
171b0 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
171c0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
171d0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
171e0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
171f0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
17200 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
17210 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
17220 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
17230 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
17240 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
17250 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
17260 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
17270 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
17280 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
17290 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
172a0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
172b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
172c0 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
172d0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
172e0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
172f0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
17300 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
17310 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
17320 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
17330 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
17340 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
17350 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
17360 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
17370 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
17380 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
17390 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
173a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
173b0 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
173c0 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
173d0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
173e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
173f0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
17400 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
17410 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
17420 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
17430 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
17440 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
17450 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
17460 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
17470 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
17480 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
17490 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
174a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
174b0 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
174c0 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
174d0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
174e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
174f0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
17500 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
17510 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
17520 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
17530 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
17540 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
17550 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
17560 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
17570 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
17580 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
17590 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
175a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
175b0 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
175c0 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
175d0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
175e0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
175f0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
17600 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
17610 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17620 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
17630 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
17640 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
17650 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
17660 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
17670 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
17680 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
17690 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
176a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
176b0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
176c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65  Enter(p);.  btre
176d0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a  eIntegrity(p);..
176e0 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
176f0 6c 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74  le has a write-t
17700 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
17710 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72   commit the shar
17720 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20  ed-btrees .  ** 
17730 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17740 73 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73  set the shared s
17750 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45  tate to TRANS_RE
17760 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  AD..  */.  if( p
17770 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
17780 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
17790 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  t rc;.    assert
177a0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
177b0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
177c0 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
177d0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
177e0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
177f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
17800 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
17810 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
17820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17830 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17840 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17850 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
17860 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69      }.    pBt->i
17870 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
17880 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  RANS_READ;.  }..
17890 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
178a0 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
178b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
178c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
178d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
178e0 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
178f0 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
17900 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
17910 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
17920 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
17930 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17940 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
17950 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
17960 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
17970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17980 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17990 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
179a0 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20  seTwo(p);.  }.  
179b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
179c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
179d0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
179e0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
179f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
17a00 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70  write-cursors op
17a10 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c  en on this handl
17a20 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  e. This is for u
17a30 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
17a40 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
17a50 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
17a60 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
17a70 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
17a80 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
17a90 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
17aa0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69  s routine, a wri
17ab0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79  te-cursor is any
17ac0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
17ad0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72  is capable of wr
17ae0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
17af0 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e  abse.  That mean
17b00 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  s the cursor was
17b10 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  .** originally o
17b20 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
17b30 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  g and the cursor
17b40 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61   has not be disa
17b50 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e  bled.** by havin
17b60 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e  g its state chan
17b70 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ged to CURSOR_FA
17b80 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULT..*/.static i
17b90 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  nt countWriteCur
17ba0 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
17bb0 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
17bc0 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
17bd0 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
17be0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
17bf0 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
17c00 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
17c10 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43  ur->wrFlag && pC
17c20 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
17c30 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
17c40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
17c50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
17c60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
17c70 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
17c80 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
17c90 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
17ca0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
17cb0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
17cc0 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
17cd0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
17ce0 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
17cf0 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
17d00 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
17d10 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
17d20 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
17d30 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
17d40 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
17d50 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
17d60 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
17d70 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
17d80 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
17d90 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
17da0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
17db0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
17dc0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
17dd0 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
17de0 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
17df0 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
17e00 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
17e10 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
17e20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
17e30 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
17e40 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
17e50 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
17e60 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
17e70 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
17e80 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
17e90 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
17ea0 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
17eb0 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
17ec0 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
17ed0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
17ee0 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
17ef0 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
17f00 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
17f10 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  or *p;.  sqlite3
17f20 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
17f30 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
17f40 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
17f50 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
17f60 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
17f70 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
17f80 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
17f90 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
17fa0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
17fb0 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65  ->skip = errCode
17fc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
17fd0 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
17fe0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
17ff0 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
18000 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
18010 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
18020 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
18030 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
18040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
18050 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
18060 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
18070 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
18080 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
18090 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
180a0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
180b0 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
180c0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
180d0 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
180e0 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
180f0 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
18100 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
18110 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
18120 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
18130 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
18140 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
18150 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
18160 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
18170 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
18180 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
18190 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
181a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
181b0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
181c0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
181d0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
181e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
181f0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18200 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
18210 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
18220 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66  (pBt, 0, 0);.#if
18230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18240 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
18250 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18260 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  K ){.    /* This
18270 20 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73   is a horrible s
18280 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20  ituation. An IO 
18290 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
182a0 72 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73  r occurred whils
182b0 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20  t.    ** trying 
182c0 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72 20 70  to save cursor p
182d0 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69  ositions. If thi
182e0 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69  s is an automati
182f0 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20  c rollback (as. 
18300 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74     ** the result
18310 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   of a constraint
18320 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  , malloc() failu
18330 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20  re or IO error) 
18340 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  then .    ** the
18350 20 63 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e   cache may be in
18360 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69  ternally inconsi
18370 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61  stent (not conta
18380 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73 29 20  in valid trees) 
18390 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e  so.    ** we can
183a0 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72  not simply retur
183b0 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74  n the error to t
183c0 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65  he caller. Inste
183d0 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a  ad, abort .    *
183e0 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68  * all queries th
183f0 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20  at may be using 
18400 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f  any of the curso
18410 72 73 20 74 68 61 74 20 66 61 69 6c 65 64 20 74  rs that failed t
18420 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  o save..    */. 
18430 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 54     sqlite3BtreeT
18440 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c  ripAllCursors(p,
18450 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   rc);.  }.#endif
18460 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
18470 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
18480 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
18490 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
184a0 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
184b0 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
184c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
184d0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
184e0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
184f0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
18500 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
18510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18520 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
18530 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
18540 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
18550 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
18560 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
18570 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
18580 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
18590 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
185a0 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
185b0 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
185c0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
185d0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
185e0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
185f0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
18600 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
18610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18620 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18630 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
18640 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
18650 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
18660 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
18670 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
18680 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
18690 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e  ..  btreeEndTran
186a0 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71  saction(p);.  sq
186b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
186c0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
186d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
186e0 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74  a statement subt
186f0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
18700 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
18710 61 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  an can be rolled
18720 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e  .** back indepen
18730 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61  dently of the ma
18740 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  in transaction. 
18750 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
18760 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a   transaction .**
18770 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
18780 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f   a subtransactio
18790 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
187a0 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
187b0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a  utomatically .**
187c0 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   if the main tra
187d0 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73  nsaction commits
187e0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
187f0 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20  **.** Statement 
18800 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  subtransactions 
18810 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20  are used around 
18820 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73  individual SQL s
18830 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61  tatements.** tha
18840 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  t are contained 
18850 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e  within a BEGIN..
18860 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20  .COMMIT block.  
18870 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a  If a constraint.
18880 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ** error occurs 
18890 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65  within the state
188a0 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74  ment, the effect
188b0 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61   of that one sta
188c0 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65  tement.** can be
188d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74   rolled back wit
188e0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72  hout having to r
188f0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69  ollback the enti
18900 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  re transaction..
18910 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e  **.** A statemen
18920 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f  t sub-transactio
18930 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
18940 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73   as an anonymous
18950 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a   savepoint. The.
18960 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  ** value passed 
18970 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61  as the second pa
18980 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74  rameter is the t
18990 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
189a0 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e  avepoints,.** in
189b0 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20  cluding the new 
189c0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
189d0 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65  int, open on the
189e0 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66   B-Tree. i.e. if
189f0 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
18a00 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e   active savepoin
18a10 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20  ts and no other 
18a20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
18a30 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20  ctions open,.** 
18a40 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e  iStatement is 1.
18a50 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20   This anonymous 
18a60 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65  savepoint can be
18a70 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c   released or rol
18a80 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  led back.** usin
18a90 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  g the sqlite3Btr
18aa0 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75  eeSavepoint() fu
18ab0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
18ac0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
18ad0 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69  Stmt(Btree *p, i
18ae0 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a  nt iStatement){.
18af0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
18b00 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
18b10 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
18b20 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73  eeEnter(p);.  as
18b30 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
18b40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
18b50 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
18b60 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20  readOnly==0 );. 
18b70 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
18b80 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ent>0 );.  asser
18b90 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d  t( iStatement>p-
18ba0 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20  >db->nSavepoint 
18bb0 29 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  );.  if( NEVER(p
18bc0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
18bd0 5f 57 52 49 54 45 20 7c 7c 20 70 42 74 2d 3e 72  _WRITE || pBt->r
18be0 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20  eadOnly) ){.    
18bf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
18c00 52 4e 41 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RNAL;.  }else{. 
18c10 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
18c20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
18c30 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
18c40 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65    /* At the page
18c50 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65  r level, a state
18c60 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
18c70 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
18c80 77 69 74 68 0a 20 20 20 20 2a 2a 20 61 6e 20 69  with.    ** an i
18c90 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61  ndex greater tha
18ca0 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73  n all savepoints
18cb0 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69   created explici
18cc0 74 6c 79 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  tly using.    **
18cd0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
18ce0 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
18cf0 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
18d00 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
18d10 20 20 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65      ** such save
18d20 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
18d30 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
18d40 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
18d50 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20   is active..    
18d60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
18d70 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
18d80 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
18d90 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
18da0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
18db0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18dd0 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  * The second arg
18de0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
18df0 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61  nction, op, is a
18e00 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f  lways SAVEPOINT_
18e10 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53  ROLLBACK.** or S
18e20 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
18e30 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
18e40 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20  either releases 
18e50 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68  or rolls back th
18e60 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69  e.** savepoint i
18e70 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72  dentified by par
18e80 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e  ameter iSavepoin
18e90 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  t, depending on 
18ea0 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66  the value .** of
18eb0 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61   op..**.** Norma
18ec0 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20  lly, iSavepoint 
18ed0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
18ee0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f  or equal to zero
18ef0 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70  . However, if op
18f00 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54   is.** SAVEPOINT
18f10 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
18f20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61  iSavepoint may a
18f30 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68  lso be -1. In th
18f40 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20  is case the .** 
18f50 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
18f60 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
18f70 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61  on are rolled ba
18f80 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66  ck. This is diff
18f90 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20  erent.** from a 
18fa0 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69  normal transacti
18fb0 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20  on rollback, as 
18fc0 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c  no locks are rel
18fd0 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  eased and the.**
18fe0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d   transaction rem
18ff0 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e  ains open..*/.in
19000 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  t sqlite3BtreeSa
19010 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70  vepoint(Btree *p
19020 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53  , int op, int iS
19030 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74  avepoint){.  int
19040 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19050 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69  .  if( p && p->i
19060 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
19070 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
19080 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19090 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  t;.    assert( o
190a0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
190b0 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45  EASE || op==SAVE
190c0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
190d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53  ;.    assert( iS
190e0 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28  avepoint>=0 || (
190f0 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26  iSavepoint==-1 &
19100 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
19110 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20  ROLLBACK) );.   
19120 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
19130 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20  er(p);.    rc = 
19140 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
19150 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
19160 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e  r, op, iSavepoin
19170 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
19180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19190 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
191a0 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ase(pBt);.    }.
191b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
191c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
191d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
191e0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
191f0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
19200 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
19210 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
19220 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68 65 20  ** iTable.  The 
19230 61 63 74 20 6f 66 20 61 63 71 75 69 72 69 6e 67  act of acquiring
19240 20 61 20 63 75 72 73 6f 72 20 67 65 74 73 20 61   a cursor gets a
19250 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a   read lock on .*
19260 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
19270 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ile..**.** If wr
19280 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
19290 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
192a0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
192b0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
192c0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
192d0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
192e0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
192f0 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
19300 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
19310 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
19320 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
19330 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
19340 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
19350 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
19360 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
19370 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
19380 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
19390 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
193a0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
193b0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
193c0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
193d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
193e0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
193f0 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
19400 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
19410 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
19420 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
19430 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
19440 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
19450 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
19460 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
19470 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
19480 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
19490 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
194a0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
194b0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
194c0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
194d0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
194e0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
194f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
19500 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
19510 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
19520 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
19530 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
19540 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
19550 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
19560 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
19570 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
19580 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
19590 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
195a0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
195b0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
195c0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
195d0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
195e0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
195f0 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
19600 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
19610 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
19620 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
19630 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
19640 65 43 75 72 73 6f 72 53 69 7a 65 28 29 20 62 79  eCursorSize() by
19650 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a  tes of memory .*
19660 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  * pointed to by 
19670 70 43 75 72 20 68 61 76 65 20 62 65 65 6e 20 7a  pCur have been z
19680 65 72 6f 65 64 20 62 79 20 74 68 65 20 63 61 6c  eroed by the cal
19690 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ler..*/.static i
196a0 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
196b0 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
196e0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
196f0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19710 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
19720 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
19730 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
19740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
19760 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
19770 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
19780 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
19790 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
197a0 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
197b0 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
197c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
197d0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
19800 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
19810 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
19820 6f 20 6e 50 61 67 65 3b 0a 20 20 42 74 53 68 61  o nPage;.  BtSha
19830 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
19840 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
19850 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
19860 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
19870 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
19880 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 0a  | wrFlag==1 );..
19890 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
198a0 6e 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  ng assert statem
198b0 65 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74  ents verify that
198c0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68   if this is a sh
198d0 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74  arable .  ** b-t
198e0 72 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ree database, th
198f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
19900 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75  holding the requ
19910 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73  ired table locks
19920 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74  , .  ** and that
19930 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   no other connec
19940 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65  tion has any ope
19950 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f  n cursor that co
19960 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20  nflicts with .  
19970 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a  ** this lock.  *
19980 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53  /.  assert( hasS
19990 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
199a0 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70  ock(p, iTable, p
199b0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77 72 46 6c  KeyInfo!=0, wrFl
199c0 61 67 2b 31 29 20 29 3b 0a 20 20 61 73 73 65 72  ag+1) );.  asser
199d0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20  t( wrFlag==0 || 
199e0 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74  !hasReadConflict
199f0 73 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a  s(p, iTable) );.
19a00 0a 20 20 69 66 28 20 4e 45 56 45 52 28 77 72 46  .  if( NEVER(wrF
19a10 6c 61 67 20 26 26 20 70 42 74 2d 3e 72 65 61 64  lag && pBt->read
19a20 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 65 74  Only) ){.    ret
19a30 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
19a40 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  NLY;.  }..  if( 
19a50 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29  pBt->pPage1==0 )
19a60 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42  {.    rc = lockB
19a70 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70 29  treeWithRetry(p)
19a80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19a90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19aa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19ab0 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67  }.  }.  pCur->pg
19ac0 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
19ad0 54 61 62 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71  Table;.  rc = sq
19ae0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
19af0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
19b00 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 29 3b   (int *)&nPage);
19b10 20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49   .  if( rc!=SQLI
19b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
19b30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
19b40 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 6e  ( iTable==1 && n
19b50 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Page==0 ){.    r
19b60 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
19b70 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  ;.    goto creat
19b80 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
19b90 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67  on;.  }.  rc = g
19ba0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
19bb0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
19bc0 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
19bd0 5b 30 5d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  [0]);.  if( rc!=
19be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19bf0 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
19c00 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
19c10 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
19c20 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
19c30 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
19c40 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
19c50 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
19c60 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b   variables, link
19c70 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
19c80 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
19c90 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75  st and set *ppCu
19ca0 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70  r (the.  ** outp
19cb0 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ut argument to t
19cc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20  his function).. 
19cd0 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79   */.  pCur->pKey
19ce0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
19cf0 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
19d00 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
19d10 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
19d20 77 72 46 6c 61 67 20 3d 20 28 75 38 29 77 72 46  wrFlag = (u8)wrF
19d30 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
19d40 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
19d50 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
19d60 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
19d70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
19d80 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
19d90 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
19da0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
19db0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
19dc0 44 3b 0a 20 20 70 43 75 72 2d 3e 63 61 63 68 65  D;.  pCur->cache
19dd0 64 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20 72  dRowid = 0;..  r
19de0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19df0 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f  ..create_cursor_
19e00 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c  exception:.  rel
19e10 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
19e20 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c  pPage[0]);.  unl
19e30 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19e40 28 70 42 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pBt);.  return 
19e50 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  rc;.}.int sqlite
19e60 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20  3BtreeCursor(.  
19e70 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
19e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19ea0 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
19eb0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
19ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
19ee0 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20  t page of table 
19ef0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74  to open */.  int
19f00 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20   wrFlag,        
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
19f30 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
19f40 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
19f50 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
19f60 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
19f70 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
19f80 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20  g to xCompare() 
19f90 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
19fa0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
19fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fc0 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75   /* Write new cu
19fd0 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  rsor here */.){.
19fe0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19ff0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1a000 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75  ;.  rc = btreeCu
1a010 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20  rsor(p, iTable, 
1a020 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f  wrFlag, pKeyInfo
1a030 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74  , pCur);.  sqlit
1a040 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1a050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a060 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1a070 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75  e size of a BtCu
1a080 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62  rsor object in b
1a090 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ytes..**.** This
1a0a0 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e   interfaces is n
1a0b0 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73  eeded so that us
1a0c0 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63  ers of cursors c
1a0d0 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a  an preallocate.*
1a0e0 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f  * sufficient sto
1a0f0 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63  rage to hold a c
1a100 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75  ursor.  The BtCu
1a110 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f  rsor object is o
1a120 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72  paque.** to user
1a130 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74  s so they cannot
1a140 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29   do the sizeof()
1a150 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68   themselves - th
1a160 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20  ey must call.** 
1a170 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
1a180 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1a190 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64  eCursorSize(void
1a1a0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65  ){.  return size
1a1b0 6f 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a  of(BtCursor);.}.
1a1c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1a1d0 61 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75  ached rowid valu
1a1e0 65 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f  e of every curso
1a1f0 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  r in the same da
1a200 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61  tabase file.** a
1a210 73 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e  s pCur and havin
1a220 67 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20  g the same root 
1a230 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70  page number as p
1a240 43 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20  Cur.  The value 
1a250 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f  is.** set to iRo
1a260 77 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  wid..**.** Only 
1a270 70 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76  positive rowid v
1a280 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64  alues are consid
1a290 65 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74  ered valid for t
1a2a0 68 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68  his cache..** Th
1a2b0 65 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69  e cache is initi
1a2c0 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20  alized to zero, 
1a2d0 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
1a2e0 76 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20  valid cache..** 
1a2f0 41 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72  A btree will wor
1a300 6b 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f  k fine with zero
1a310 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77   or negative row
1a320 69 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61  ids.  We just ca
1a330 6e 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65  nnot.** cache ze
1a340 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ro or negative r
1a350 6f 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61  owids, which mea
1a360 6e 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75  ns tables that u
1a370 73 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65  se zero or.** ne
1a380 67 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69  gative rowids mi
1a390 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
1a3a0 20 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e   slower.  But in
1a3b0 20 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a   practice, zero.
1a3c0 2a 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72  ** or negative r
1a3d0 6f 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75  owids are very u
1a3e0 6e 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20  ncommon so this 
1a3f0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
1a400 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64  problem..*/.void
1a410 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
1a420 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75  CachedRowid(BtCu
1a430 72 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69  rsor *pCur, sqli
1a440 74 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64  te3_int64 iRowid
1a450 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
1a460 3b 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e  ;.  for(p=pCur->
1a470 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1a480 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1a490 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
1a4a0 74 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t==pCur->pgnoRoo
1a4b0 74 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77  t ) p->cachedRow
1a4c0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  id = iRowid;.  }
1a4d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a4e0 3e 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52  >cachedRowid==iR
1a4f0 6f 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  owid );.}../*.**
1a500 20 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68   Return the cach
1a510 65 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  ed rowid for the
1a520 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20   given cursor.  
1a530 41 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65  A negative or ze
1a540 72 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  ro.** return val
1a550 75 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ue indicates tha
1a560 74 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68  t the rowid cach
1a570 65 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64  e is invalid and
1a580 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67   should be.** ig
1a590 6e 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72  nored.  If the r
1a5a0 6f 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e  owid cache has n
1a5b0 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
1a5c0 20 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20   set, then a.** 
1a5d0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
1a5e0 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74  ..*/.sqlite3_int
1a5f0 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  64 sqlite3BtreeG
1a600 65 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74  etCachedRowid(Bt
1a610 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
1a620 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61   return pCur->ca
1a630 63 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  chedRowid;.}../*
1a640 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73  .** Close a curs
1a650 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f  or.  The read lo
1a660 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1a670 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61  se file is relea
1a680 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  sed.** when the 
1a690 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63  last cursor is c
1a6a0 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  losed..*/.int sq
1a6b0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
1a6c0 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
1a6d0 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a  pCur){.  Btree *
1a6e0 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70  pBtree = pCur->p
1a6f0 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74  Btree;.  if( pBt
1a700 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ree ){.    int i
1a710 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  ;.    BtShared *
1a720 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
1a730 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1a740 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
1a750 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a760 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
1a770 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1a780 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
1a790 70 43 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  pCur->pPrev->pNe
1a7a0 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
1a7b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a7c0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
1a7d0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
1a7e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1a7f0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
1a800 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
1a810 50 72 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72  Prev = pCur->pPr
1a820 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ev;.    }.    fo
1a830 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e  r(i=0; i<=pCur->
1a840 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
1a850 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1a860 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  Cur->apPage[i]);
1a870 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63  .    }.    unloc
1a880 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
1a890 42 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64  Bt);.    invalid
1a8a0 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
1a8b0 28 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73  (pCur);.    /* s
1a8c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1a8d0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1a8e0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
1a8f0 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
1a900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a910 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1a920 53 54 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  ST./*.** Make a 
1a930 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
1a940 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74   by filling in t
1a950 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54 65  he fields of pTe
1a960 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74 65  mpCur..** The te
1a970 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 69  mporary cursor i
1a980 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72  s not on the cur
1a990 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68 65  sor list for the
1a9a0 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20   Btree..*/.void 
1a9b0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
1a9c0 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73  empCursor(BtCurs
1a9d0 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72 73  or *pCur, BtCurs
1a9e0 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a 20  or *pTempCur){. 
1a9f0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
1aa00 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1aa10 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d 65  ex(pCur) );.  me
1aa20 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20 70  mcpy(pTempCur, p
1aa30 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43 75  Cur, sizeof(BtCu
1aa40 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  rsor));.  pTempC
1aa50 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
1aa60 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
1aa70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
1aa80 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69 50   i<=pTempCur->iP
1aa90 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  age; i++){.    s
1aaa0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
1aab0 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  TempCur->apPage[
1aac0 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  i]->pDbPage);.  
1aad0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 6d  }.  assert( pTem
1aae0 70 43 75 72 2d 3e 70 4b 65 79 3d 3d 30 20 29 3b  pCur->pKey==0 );
1aaf0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1ab00 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 23 69 66  ITE_TEST */..#if
1ab10 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1ab20 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74  /*.** Delete a t
1ab30 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
1ab40 73 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65  such as was made
1ab50 20 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65   by the CreateTe
1ab60 6d 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a  mporaryCursor().
1ab70 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76  ** function abov
1ab80 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
1ab90 65 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65  e3BtreeReleaseTe
1aba0 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  mpCursor(BtCurso
1abb0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
1abc0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  i;.  assert( cur
1abd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1abe0 75 72 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ur) );.  for(i=0
1abf0 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
1ac00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1ac10 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
1ac20 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70  ur->apPage[i]->p
1ac30 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73  DbPage);.  }.  s
1ac40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1ac50 2d 3e 70 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64 69  ->pKey);.}.#endi
1ac60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
1ac70 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20   */../*.** Make 
1ac80 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f  sure the BtCurso
1ac90 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  r* given in the 
1aca0 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76  argument has a v
1acb0 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72  alid.** BtCursor
1acc0 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  .info structure.
1acd0 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61    If it is not a
1ace0 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61  lready valid, ca
1acf0 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  ll.** sqlite3Btr
1ad00 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f  eeParseCell() to
1ad10 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a   fill it in..**.
1ad20 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f  ** BtCursor.info
1ad30 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20 74   is a cache of t
1ad40 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  he information i
1ad50 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 65  n the current ce
1ad60 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69  ll..** Using thi
1ad70 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73 20  s cache reduces 
1ad80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61  the number of ca
1ad90 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
1ada0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
1adb0 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35  **.** 2007-06-25
1adc0 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62 75  :  There is a bu
1add0 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f  g in some versio
1ade0 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74 20  ns of MSVC that 
1adf0 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d  cause the.** com
1ae00 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20 77  piler to crash w
1ae10 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  hen getCellInfo(
1ae20 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  ) is implemented
1ae30 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20   as a macro..** 
1ae40 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 6d  But there is a m
1ae50 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65 64  easureable speed
1ae60 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75 73   advantage to us
1ae70 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e  ing the macro on
1ae80 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65   gcc.** (when le
1ae90 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69  ss compiler opti
1aea0 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d  mizations like -
1aeb0 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75 73  Os or -O0 are us
1aec0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1aed0 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f  mpiler is not do
1aee0 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69 6e  ing agressive in
1aef0 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65 20  lining.)  So we 
1af00 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74  use a real funct
1af10 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20  ion.** for MSVC 
1af20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72 20  and a macro for 
1af30 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2e  everything else.
1af40 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e 0a    Ticket #2457..
1af50 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
1af60 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
1af70 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
1af80 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1af90 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1afa0 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
1afb0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
1afc0 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
1afd0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
1afe0 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
1aff0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
1b000 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
1b010 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
1b020 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
1b030 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d     assert( memcm
1b040 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  p(&info, &pCur->
1b050 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
1b060 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65  o))==0 );.  }.#e
1b070 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73  lse.  #define as
1b080 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a  sertCellInfo(x).
1b090 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d  #endif.#ifdef _M
1b0a0 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20  SC_VER.  /* Use 
1b0b0 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20  a real function 
1b0c0 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20  in MSVC to work 
1b0d0 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74  around bugs in t
1b0e0 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f  hat compiler. */
1b0f0 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67  .  static void g
1b100 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  etCellInfo(BtCur
1b110 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
1b120 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1b130 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Size==0 ){.     
1b140 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
1b150 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20 20  r->iPage;.      
1b160 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
1b170 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  eCell(pCur->apPa
1b180 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e  ge[iPage],pCur->
1b190 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43  aiIdx[iPage],&pC
1b1a0 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20  ur->info);.     
1b1b0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1b1c0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
1b1d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65 6c  .      assertCel
1b1e0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
1b1f0 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a 20   }.  }.#else /* 
1b200 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52 20  if not _MSC_VER 
1b210 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d 61  */.  /* Use a ma
1b220 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65 72  cro in all other
1b230 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74 68   compilers so th
1b240 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
1b250 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23 64  is inlined */.#d
1b260 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e 66  efine getCellInf
1b270 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20 20  o(pCur)         
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1b2b0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
1b2c0 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20  nSize==0 ){     
1b2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1b300 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
1b310 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20 20  pCur->iPage;    
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1b350 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1b360 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
1b370 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
1b380 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
1b390 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20  ],&pCur->info); 
1b3a0 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  \.    pCur->vali
1b3b0 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20  dNKey = 1;      
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3f0 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20   \.  }else{     
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43 65    \.    assertCe
1b450 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20 20  llInfo(pCur);   
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
1b4a0 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
1b4b0 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
1b4c0 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
1b4d0 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
1b4e0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
1b4f0 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
1b500 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
1b510 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
1b520 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
1b530 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
1b540 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
1b550 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
1b560 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
1b570 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
1b580 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
1b590 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1b5a0 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
1b5b0 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
1b5c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
1b5d0 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
1b5e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1b5f0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
1b600 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
1b610 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1b620 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1b630 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1b640 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
1b650 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
1b660 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
1b670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b680 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1b690 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1b6a0 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
1b6b0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1b6c0 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
1b6d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b6e0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1b6f0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
1b700 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b710 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1b720 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
1b730 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
1b740 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
1b750 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b760 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
1b770 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
1b780 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
1b790 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
1b7a0 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
1b7b0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
1b7c0 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
1b7d0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
1b7e0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
1b7f0 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
1b800 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
1b810 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
1b820 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
1b830 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
1b840 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
1b850 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1b860 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
1b870 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
1b880 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1b890 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
1b8a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
1b8b0 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
1b8c0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1b8d0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1b8e0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1b8f0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1b900 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1b910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b920 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b930 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b940 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
1b950 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1b960 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1b970 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
1b980 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
1b990 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
1b9a0 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
1b9b0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
1b9c0 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
1b9d0 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
1b9e0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1b9f0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
1ba00 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
1ba10 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
1ba20 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
1ba30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1ba40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1ba50 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ba60 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
1ba70 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
1ba80 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
1ba90 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
1baa0 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
1bab0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
1bac0 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
1bad0 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
1bae0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
1baf0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
1bb00 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
1bb10 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
1bb20 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
1bb30 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
1bb40 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
1bb50 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
1bb60 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
1bb70 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1bb80 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
1bb90 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1bba0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
1bbb0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75  *.** The page nu
1bbc0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
1bbd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1bbe0 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
1bbf0 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  t is .** written
1bc00 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20   to *pPgnoNext. 
1bc10 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20  If page ovfl is 
1bc20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
1bc30 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20   its linked .** 
1bc40 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74  list, *pPgnoNext
1bc50 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
1bc60 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67   .**.** If ppPag
1bc70 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61  e is not NULL, a
1bc80 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  nd a reference t
1bc90 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
1bca0 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69  ject correspondi
1bcb0 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75  ng.** to page nu
1bcc0 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f  mber pOvfl was o
1bcd0 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70  btained, then *p
1bce0 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
1bcf0 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a  point to that.**
1bd00 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69   reference. It i
1bd10 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
1bd20 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
1bd30 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61  er to call relea
1bd40 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a  sePage().** on *
1bd50 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74  ppPage to free t
1bd60 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e  he reference. In
1bd70 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
1bd80 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61  s obtained (beca
1bd90 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74  use.** the point
1bda0 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20  er-map was used 
1bdb0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61  to obtain the va
1bdc0 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65  lue for *pPgnoNe
1bdd0 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70  xt), then.** *pp
1bde0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a  Page is set to z
1bdf0 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
1be00 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
1be10 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
1be20 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66  pBt, .  Pgno ovf
1be30 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1be40 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77       /* Overflow
1be50 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
1be60 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
1be70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1be80 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
1be90 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
1bea0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
1beb0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
1bec0 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
1bed0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
1bee0 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
1bef0 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
1bf00 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
1bf10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1bf20 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
1bf30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1bf40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1bf50 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
1bf60 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
1bf70 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1bf80 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
1bf90 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
1bfa0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1bfb0 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
1bfc0 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
1bfd0 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
1bfe0 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
1bff0 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
1c000 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
1c010 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
1c020 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
1c030 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
1c040 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
1c050 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
1c060 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
1c070 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
1c080 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
1c090 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
1c0a0 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
1c0b0 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
1c0c0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1c0d0 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1c0e0 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
1c0f0 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
1c100 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
1c110 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
1c120 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
1c130 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
1c140 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1c150 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1c160 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
1c170 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
1c180 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  <=pagerPagecount
1c190 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
1c1a0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
1c1b0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
1c1c0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
1c1d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c1e0 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
1c1f0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
1c200 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
1c210 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
1c220 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
1c230 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1c240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c250 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
1c260 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c270 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c280 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
1c290 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c  t, ovfl, &pPage,
1c2a0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
1c2b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
1c2c0 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20   pPage==0);.    
1c2d0 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72  if( next==0 && r
1c2e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c2f0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
1c300 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1c310 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
1c320 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
1c330 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
1c340 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
1c350 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
1c360 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
1c370 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
1c380 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
1c390 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
1c3a0 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
1c3b0 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
1c3c0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
1c3d0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
1c3e0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
1c3f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
1c400 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
1c410 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
1c420 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1c430 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
1c440 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
1c450 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
1c460 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
1c470 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
1c480 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
1c490 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
1c4a0 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
1c4b0 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
1c4c0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
1c4d0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
1c4e0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
1c4f0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
1c500 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
1c510 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
1c520 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
1c530 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
1c540 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1c550 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
1c560 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
1c570 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
1c580 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
1c590 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
1c5a0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
1c5b0 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
1c5c0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
1c5d0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1c5e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c5f0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
1c600 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
1c610 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c620 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
1c630 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
1c640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1c650 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
1c660 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
1c670 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
1c680 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
1c690 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
1c6a0 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
1c6b0 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
1c6c0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
1c6d0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1c6e0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
1c6f0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
1c700 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
1c710 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c720 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
1c730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c740 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1c750 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1c760 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
1c770 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
1c780 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c790 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
1c7a0 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
1c7b0 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
1c7c0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
1c7d0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
1c7e0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
1c7f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c810 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1c820 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
1c830 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
1c840 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
1c850 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
1c860 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
1c870 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
1c880 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
1c890 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
1c8a0 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
1c8b0 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
1c8c0 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
1c8d0 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
1c8e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
1c8f0 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
1c900 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
1c910 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
1c920 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
1c930 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
1c940 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
1c950 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
1c960 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
1c970 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
1c980 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
1c990 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1c9a0 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
1c9b0 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
1c9c0 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
1c9d0 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
1c9e0 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
1c9f0 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
1ca00 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
1ca10 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
1ca20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
1ca30 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
1ca40 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
1ca50 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
1ca60 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
1ca70 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
1ca80 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1ca90 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
1caa0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
1cab0 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
1cac0 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
1cad0 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
1cae0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
1caf0 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
1cb00 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
1cb10 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
1cb20 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
1cb30 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
1cb40 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
1cb50 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1cb60 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
1cb70 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
1cb80 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
1cb90 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
1cba0 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
1cbb0 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
1cbc0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1cbd0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1cbe0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
1cbf0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
1cc00 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
1cc10 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
1cc20 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
1cc30 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
1cc40 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
1cc50 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
1cc60 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
1cc70 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
1cc80 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
1cc90 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
1cca0 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
1ccb0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1ccc0 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
1ccd0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
1cce0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
1ccf0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
1cd00 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
1cd10 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
1cd20 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
1cd30 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
1cd40 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
1cd50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cd60 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
1cd70 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
1cd80 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
1cd90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
1cda0 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
1cdb0 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
1cdc0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
1cdd0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
1cde0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
1cdf0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
1ce00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
1ce10 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
1ce20 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
1ce30 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
1ce40 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
1ce50 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
1ce60 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
1ce70 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
1ce80 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
1ce90 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
1cea0 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cec0 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
1ced0 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
1cee0 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
1cef0 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
1cf00 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
1cf10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
1cf20 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
1cf30 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
1cf40 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1cf50 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1cf60 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65  ]; /* Btree page
1cf70 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72   of current entr
1cf80 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  y */.  BtShared 
1cf90 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
1cfa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cfb0 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73     /* Btree this
1cfc0 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20   cursor belongs 
1cfd0 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  to */..  assert(
1cfe0 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65   pPage );.  asse
1cff0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1d000 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1d010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1d020 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1d030 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  age]<pPage->nCel
1d040 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
1d050 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1d060 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
1d070 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
1d080 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
1d090 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
1d0a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
1d0b0 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
1d0c0 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
1d0d0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
1d0e0 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20 73  .nKey);..  if( s
1d0f0 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66  kipKey ){.    of
1d100 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20  fset += nKey;.  
1d110 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61  }.  if( offset+a
1d120 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e  mt > nKey+pCur->
1d130 69 6e 66 6f 2e 6e 44 61 74 61 20 0a 20 20 20 7c  info.nData .   |
1d140 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  | &aPayload[pCur
1d150 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e  ->info.nLocal] >
1d160 20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70   &pPage->aData[p
1d170 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a  Bt->usableSize].
1d180 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69    ){.    /* Tryi
1d190 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  ng to read or wr
1d1a0 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64  ite past the end
1d1b0 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73 20   of the data is 
1d1c0 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
1d1d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1d1e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1d1f0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64  .  /* Check if d
1d200 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64  ata must be read
1d210 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d  /written to/from
1d220 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20   the btree page 
1d230 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28  itself. */.  if(
1d240 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e   offset<pCur->in
1d250 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
1d260 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
1d270 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70    if( a+offset>p
1d280 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1d290 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43   ){.      a = pC
1d2a0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1d2b0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a  - offset;.    }.
1d2c0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
1d2d0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
1d2e0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c  ffset], pBuf, a,
1d2f0 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62   eOp, pPage->pDb
1d300 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65  Page);.    offse
1d310 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20  t = 0;.    pBuf 
1d320 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d  += a;.    amt -=
1d330 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
1d340 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d   offset -= pCur-
1d350 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
1d360 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
1d370 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
1d380 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32  ){.    const u32
1d390 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d   ovflSize = pBt-
1d3a0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
1d3b0 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65    /* Bytes conte
1d3c0 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65  nt per ovfl page
1d3d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78   */.    Pgno nex
1d3e0 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74  tPage;..    next
1d3f0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
1d400 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
1d410 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a  info.nLocal]);..
1d420 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1d430 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
1d440 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63   /* If the isInc
1d450 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
1d460 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 65 20   is set and the 
1d470 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
1d480 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20  ow[].    ** has 
1d490 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
1d4a0 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20  ed, allocate it 
1d4b0 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79 20 69  now. The array i
1d4c0 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a  s sized at.    *
1d4d0 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  * one entry for 
1d4e0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
1d4f0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1d500 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20  ow chain. The.  
1d510 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72    ** page number
1d520 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
1d530 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73  erflow page is s
1d540 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
1d550 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74  ow[0],.    ** et
1d560 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
1d570 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
1d580 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22  [] array means "
1d590 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20  not yet known". 
1d5a0 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65     ** (the cache
1d5b0 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
1d5c0 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
1d5d0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e    if( pCur->isIn
1d5e0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
1d5f0 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1d600 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
1d610 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
1d620 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
1d630 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
1d640 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
1d650 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  e;.      pCur->a
1d660 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f  Overflow = (Pgno
1d670 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   *)sqlite3Malloc
1d680 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f  Zero(sizeof(Pgno
1d690 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  )*nOvfl);.      
1d6a0 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43  if( nOvfl && !pC
1d6b0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b  ur->aOverflow ){
1d6c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d6d0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1d6e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1d6f0 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
1d700 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1d710 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
1d720 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
1d730 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68   ** entry for th
1d740 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64  e first required
1d750 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1d760 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20  s valid, skip.  
1d770 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
1d780 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
1d790 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
1d7a0 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
1d7b0 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76  erflow[offset/ov
1d7c0 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20  flSize] ){.     
1d7d0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
1d7e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
1d7f0 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72   nextPage = pCur
1d800 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1d810 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  ];.      offset 
1d820 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69  = (offset%ovflSi
1d830 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ze);.    }.#endi
1d840 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  f..    for( ; rc
1d850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1d860 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
1d870 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e  ; iIdx++){..#ifn
1d880 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d890 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f  INCRBLOB.      /
1d8a0 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c 20 70  * If required, p
1d8b0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
1d8c0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1d8d0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ache. */.      i
1d8e0 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  f( pCur->aOverfl
1d8f0 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ow ){.        as
1d900 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65  sert(!pCur->aOve
1d910 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70  rflow[iIdx] || p
1d920 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1d930 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b  Idx]==nextPage);
1d940 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61  .        pCur->a
1d950 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
1d960 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20   nextPage;.     
1d970 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20   }.#endif..     
1d980 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
1d990 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
1d9a0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
1d9b0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
1d9c0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
1d9d0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
1d9e0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
1d9f0 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
1da00 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
1da10 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
1da20 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
1da30 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
1da40 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
1da50 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
1da60 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
1da70 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
1da80 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
1da90 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
1daa0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
1dab0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
1dac0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
1dad0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1dae0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1daf0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
1db00 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
1db10 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1db20 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
1db30 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
1db40 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
1db50 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20  x+1];.        } 
1db60 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
1db70 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
1db80 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
1db90 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
1dba0 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
1dbb0 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c    offset -= ovfl
1dbc0 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Size;.      }els
1dbd0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  e{.        /* Ne
1dbe0 65 64 20 74 6f 20 72 65 61 64 20 74 68 69 73 20  ed to read this 
1dbf0 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49  page properly. I
1dc00 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  t contains some 
1dc10 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
1dc20 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20  * range of data 
1dc30 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 72 65  that is being re
1dc40 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77  ad (eOp==0) or w
1dc50 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e  ritten (eOp!=0).
1dc60 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1dc70 20 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50      DbPage *pDbP
1dc80 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  age;.        int
1dc90 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20   a = amt;.      
1dca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1dcb0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
1dcc0 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
1dcd0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1dce0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dcf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1dd00 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
1dd10 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
1dd20 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1dd30 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
1dd40 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
1dd50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1dd60 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
1dd70 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
1dd80 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a       a = ovflSiz
1dd90 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1dda0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ddb0 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
1ddc0 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
1ddd0 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c  set+4], pBuf, a,
1dde0 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a   eOp, pDbPage);.
1ddf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1de00 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
1de10 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1de20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
1de30 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
1de40 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 2b            pBuf +
1de50 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = a;.        }. 
1de60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1de70 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1de80 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
1de90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1dea0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1deb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1dec0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
1ded0 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79   part of the key
1dee0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1def0 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45   cursor pCur.  E
1df00 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20  xactly.** "amt" 
1df10 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
1df20 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42  ansfered into pB
1df30 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
1df40 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
1df50 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
1df60 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1df70 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
1df80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
1df90 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
1dfa0 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
1dfb0 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
1dfc0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
1dfd0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
1dfe0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
1dff0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
1e000 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
1e010 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1e020 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
1e030 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
1e040 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1e050 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1e060 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1e070 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
1e080 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1e090 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1e0a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1e0b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1e0c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1e0d0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
1e0e0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
1e0f0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1e100 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a  pCur->iPage] );.
1e110 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 70      if( pCur->ap
1e120 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
1e130 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e140 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e150 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
1e160 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
1e170 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
1e180 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1e190 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
1e1a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
1e1b0 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
1e1c0 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75   offset, amt, (u
1e1d0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42  nsigned char*)pB
1e1e0 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 0, 0);.  }. 
1e1f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e200 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
1e210 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
1e220 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
1e230 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
1e240 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
1e250 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
1e260 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
1e270 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
1e280 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
1e290 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
1e2a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1e2b0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
1e2c0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
1e2d0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
1e2e0 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
1e2f0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
1e300 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
1e310 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
1e320 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
1e330 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e340 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
1e350 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
1e360 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
1e370 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
1e380 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
1e390 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1e3a0 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
1e3b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e3c0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
1e3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
1e3e0 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
1e3f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1e400 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1e410 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
1e420 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
1e430 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1e440 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e450 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1e460 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1e470 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
1e480 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
1e490 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
1e4a0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1e4b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1e4c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e4d0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
1e4e0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
1e4f0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
1e500 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
1e510 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
1e520 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20  , amt, pBuf, 1, 
1e530 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1e540 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1e550 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e560 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
1e570 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
1e580 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
1e590 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
1e5a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
1e5b0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
1e5c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1e5d0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
1e5e0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
1e5f0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
1e600 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
1e610 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
1e620 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
1e630 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
1e640 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
1e650 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
1e660 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
1e670 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
1e680 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
1e690 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
1e6a0 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
1e6b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e6c0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
1e6d0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
1e6e0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
1e6f0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
1e700 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
1e710 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
1e720 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
1e730 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
1e740 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
1e750 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
1e760 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
1e770 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
1e780 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
1e790 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
1e7a0 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
1e7b0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
1e7c0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
1e7d0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
1e7e0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
1e7f0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
1e800 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a 20  o reassemble.** 
1e810 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
1e820 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
1e830 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
1e840 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
1e850 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
1e860 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
1e870 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
1e880 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
1e890 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
1e8a0 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
1e8b0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
1e8c0 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
1e8d0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
1e8e0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
1e8f0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
1e900 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e910 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
1e920 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1e930 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
1e940 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
1e950 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
1e960 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
1e970 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
1e980 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
1e990 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
1e9a0 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
1e9b0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
1e9c0 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
1e9d0 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
1e9e0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
1e9f0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
1ea00 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
1ea10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
1ea20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 75 33 32   u32 nKey;.  u32
1ea30 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
1ea40 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
1ea50 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
1ea60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1ea70 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
1ea80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1ea90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1eaa0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  D );.  assert( c
1eab0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1eac0 70 43 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65  pCur) );.  pPage
1ead0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1eae0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1eaf0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
1eb00 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1eb10 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1eb20 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
1eb30 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
1eb40 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43   = pCur->info.pC
1eb50 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ell;.  aPayload 
1eb60 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48  += pCur->info.nH
1eb70 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50 61  eader;.  if( pPa
1eb80 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1eb90 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65    nKey = 0;.  }e
1eba0 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  lse{.    nKey = 
1ebb0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
1ebc0 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nKey;.  }.  if( 
1ebd0 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  skipKey ){.    a
1ebe0 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
1ebf0 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1ec00 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
1ec10 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73 65 7b  - nKey;.  }else{
1ec20 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 70 43  .    nLocal = pC
1ec30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1ec40 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61 6c 3e  .    if( nLocal>
1ec50 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e 4c  nKey ){.      nL
1ec60 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20 20 20  ocal = nKey;.   
1ec70 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d   }.  }.  *pAmt =
1ec80 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74 75 72   nLocal;.  retur
1ec90 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a  n aPayload;.}...
1eca0 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e  /*.** For the en
1ecb0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
1ecc0 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f  pCur is point to
1ecd0 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d  , return as.** m
1ece0 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65  any bytes of the
1ecf0 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20   key or data as 
1ed00 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  are available on
1ed10 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d   the local.** b-
1ed20 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74  tree page.  Writ
1ed30 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
1ed40 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20  available bytes 
1ed50 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a  into *pAmt..**.*
1ed60 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
1ed70 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65  turned is epheme
1ed80 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61  ral.  The key/da
1ed90 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f  ta may move.** o
1eda0 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f  r be destroyed o
1edb0 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  n the next call 
1edc0 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75  to any Btree rou
1edd0 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  tine,.** includi
1ede0 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74  ng calls from ot
1edf0 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69  her threads agai
1ee00 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63  nst the same cac
1ee10 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20  he..** Hence, a 
1ee20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53  mutex on the BtS
1ee30 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20  hared should be 
1ee40 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61  held prior to ca
1ee50 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f  lling.** this ro
1ee60 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utine..**.** The
1ee70 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75  se routines is u
1ee80 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b  sed to get quick
1ee90 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61   access to key a
1eea0 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68  nd data.** in th
1eeb0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
1eec0 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20  ere no overflow 
1eed0 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a  pages are used..
1eee0 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  */.const void *s
1eef0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65  qlite3BtreeKeyFe
1ef00 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1ef10 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1ef20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ef30 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1ef40 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1ef50 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1ef60 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1ef70 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
1ef80 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
1ef90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
1efa0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
1efb0 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
1efc0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
1efd0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1efe0 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f  rn 0;.}.const vo
1eff0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1f000 44 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73  DataFetch(BtCurs
1f010 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1f020 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Amt){.  assert( 
1f030 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1f040 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1f050 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1f060 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1f070 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1f080 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
1f090 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1f0a0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
1f0b0 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
1f0c0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
1f0d0 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
1f0e0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
1f0f0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1f100 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
1f110 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
1f120 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
1f130 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
1f140 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
1f150 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
1f160 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
1f170 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
1f180 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
1f190 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
1f1a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
1f1b0 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
1f1c0 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
1f1d0 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
1f1e0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
1f1f0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
1f200 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f210 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1f220 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1f230 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1f240 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1f250 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
1f260 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
1f270 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1f280 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
1f290 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
1f2a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1f2b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1f2c0 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
1f2d0 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
1f2e0 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20  o, &pNewPage);. 
1f2f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1f300 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
1f310 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
1f320 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
1f330 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
1f340 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
1f350 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1f360 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1f370 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1f380 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
1f390 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
1f3a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1f3b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1f3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f3d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
1f3e0 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
1f3f0 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
1f400 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
1f410 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
1f420 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
1f430 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
1f440 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1f450 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
1f460 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
1f470 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
1f480 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
1f490 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
1f4a0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1f4b0 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
1f4c0 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
1f4d0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1f4e0 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
1f4f0 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
1f500 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1f510 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
1f520 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
1f530 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
1f540 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
1f550 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
1f560 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
1f570 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
1f580 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
1f590 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1f5a0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
1f5b0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
1f5c0 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
1f5d0 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
1f5e0 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1f5f0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
1f600 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
1f610 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
1f620 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
1f630 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
1f640 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
1f650 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1f660 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
1f670 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
1f680 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
1f690 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
1f6a0 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
1f6b0 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
1f6c0 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1f6d0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1f6e0 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1f6f0 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1f700 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1f710 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1f720 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1f730 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1f740 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1f750 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
1f760 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1f770 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
1f780 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1f790 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1f7a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1f7b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1f7c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1f7d0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1f7e0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
1f7f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1f800 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1f810 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1f820 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
1f830 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1f840 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
1f850 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1f860 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
1f870 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
1f880 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
1f890 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61  gno.  );.  relea
1f8a0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1f8b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1f8c0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
1f8d0 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
1f8e0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1f8f0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1f900 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
1f910 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1f920 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
1f930 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1f940 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
1f950 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
1f960 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
1f970 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f980 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
1f990 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
1f9a0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1f9b0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
1f9c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1f9d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1f9e0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
1f9f0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
1fa00 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
1fa10 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1fa20 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
1fa30 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1fa40 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
1fa50 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
1fa60 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
1fa70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
1fa80 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1fa90 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
1faa0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1fab0 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
1fac0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
1fad0 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  kip;.    }.    s
1fae0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1faf0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
1fb00 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
1fb10 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 69  Page>=0 ){.    i
1fb20 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1fb30 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  1; i<=pCur->iPag
1fb40 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
1fb50 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d  eleasePage(pCur-
1fb60 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20  >apPage[i]);.   
1fb70 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1fb80 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49 54  if( .      SQLIT
1fb90 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74 41  E_OK!=(rc = getA
1fba0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
1fbb0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
1fbc0 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  &pCur->apPage[0]
1fbd0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1fbe0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1fbf0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1fc00 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1fc10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f      }.  }..  pRo
1fc20 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ot = pCur->apPag
1fc30 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e[0];.  assert( 
1fc40 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75  pRoot->pgno==pCu
1fc50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20  r->pgnoRoot );. 
1fc60 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
1fc70 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
1fc80 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
1fc90 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1fca0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1fcb0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69   0;.  pCur->vali
1fcc0 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69 66  dNKey = 0;..  if
1fcd0 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d  ( pRoot->nCell==
1fce0 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61  0 && !pRoot->lea
1fcf0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75  f ){.    Pgno su
1fd00 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70  bpage;.    if( p
1fd10 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20  Root->pgno!=1 ) 
1fd20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1fd30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1fd40 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1fd50 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
1fd60 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
1fd70 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
1fd80 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
1fd90 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
1fda0 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
1fdb0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1fdc0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
1fdd0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1fde0 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
1fdf0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1fe00 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1fe10 28 28 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30  ((pRoot->nCell>0
1fe20 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43  )?CURSOR_VALID:C
1fe30 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a  URSOR_INVALID);.
1fe40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1fe50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1fe60 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
1fe70 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  o the left-most 
1fe80 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
1fe90 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20  th the.** entry 
1fea0 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63  to which it is c
1feb0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e  urrently pointin
1fec0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66  g..**.** The lef
1fed0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74  t-most leaf is t
1fee0 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1fef0 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74  smallest key - t
1ff00 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61  he first.** in a
1ff10 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a  scending order..
1ff20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1ff30 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43  veToLeftmost(BtC
1ff40 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1ff50 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1ff60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1ff70 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1ff80 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1ff90 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1ffa0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1ffb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ffc0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1ffd0 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1ffe0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1fff0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
20000 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
20010 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
20020 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
20030 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
20040 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
20050 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
20060 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
20070 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
20080 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
20090 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
200a0 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
200b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
200c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
200d0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
200e0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
200f0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
20100 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
20110 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
20120 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
20130 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
20140 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
20150 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
20160 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
20170 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
20180 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
20190 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
201a0 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
201b0 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
201c0 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
201d0 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
201e0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
201f0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
20200 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
20210 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
20220 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
20230 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
20240 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
20250 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
20260 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
20270 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
20280 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
20290 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
202a0 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
202b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
202c0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
202d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
202e0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
202f0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
20300 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
20310 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
20320 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
20330 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61  LITE_OK && !(pPa
20340 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
20350 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d  e[pCur->iPage])-
20360 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
20370 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
20380 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
20390 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
203a0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
203b0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
203c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
203d0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
203e0 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
203f0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
20400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
20410 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
20420 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
20430 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43  >nCell-1;.    pC
20440 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
20450 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
20460 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d  lidNKey = 0;.  }
20470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20480 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
20490 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
204a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
204b0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
204c0 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
204d0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
204e0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
204f0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
20500 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
20510 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
20520 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
20530 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
20540 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
20550 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
20560 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
20570 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
20580 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
20590 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
205a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
205b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
205c0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
205d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
205e0 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
205f0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
20600 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
20610 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
20620 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
20630 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
20640 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
20650 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
20660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
20670 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  es = 1;.      rc
20680 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20690 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
206a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
206b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
206c0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
206d0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
206e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
206f0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
20700 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
20720 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
20730 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
20740 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
20750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
20760 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
20770 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
20780 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
20790 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
207a0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
207b0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
207c0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
207d0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
207e0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
207f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
20800 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
20810 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
20820 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
20830 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
20840 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
20850 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
20860 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
20870 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75  ..  /* If the cu
20880 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70 6f 69  rsor already poi
20890 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73 74 20  nts to the last 
208a0 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73 20 61  entry, this is a
208b0 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
208c0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70   CURSOR_VALID==p
208d0 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26 20 70  Cur->eState && p
208e0 43 75 72 2d 3e 61 74 4c 61 73 74 20 29 7b 0a 23  Cur->atLast ){.#
208f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
20900 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
20910 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
20920 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
20930 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
20940 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
20950 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
20960 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
20970 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
20980 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
20990 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
209a0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
209b0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
209c0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
209d0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
209e0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
209f0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
20a00 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
20a10 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
20a20 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
20a30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
20a40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
20a50 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
20a60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
20a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20a80 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
20a90 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
20aa0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ab0 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
20ac0 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
20ad0 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
20ae0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
20af0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
20b00 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
20b10 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
20b20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20b30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
20b40 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20b50 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
20b60 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
20b70 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
20b80 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
20b90 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
20ba0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
20bb0 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  1:0;.    }.  }. 
20bc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
20bd0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
20be0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
20bf0 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
20c00 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
20c10 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
20c20 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
20c30 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
20c40 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
20c50 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
20c60 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
20c70 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
20c80 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
20c90 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
20ca0 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
20cb0 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
20cc0 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
20cd0 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
20ce0 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
20cf0 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
20d00 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
20d10 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
20d20 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
20d30 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
20d40 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
20d50 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
20d60 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
20d70 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
20d80 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
20d90 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
20da0 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
20db0 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
20dc0 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
20dd0 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
20de0 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
20df0 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
20e00 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
20e10 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
20e20 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
20e30 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
20e40 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
20e50 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
20e60 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
20e70 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
20e80 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
20e90 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
20ea0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
20eb0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
20ec0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
20ed0 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
20ee0 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
20ef0 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
20f00 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
20f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
20f30 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
20f40 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
20f50 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
20f60 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
20f70 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
20f80 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
20f90 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
20fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
20fb0 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
20fc0 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
20fd0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
20fe0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
20ff0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
21000 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
21010 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
21020 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
21030 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
21040 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
21050 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
21060 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75  Unpacked(.  BtCu
21070 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
21080 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
21090 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
210a0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
210b0 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20  rd *pIdxKey, /* 
210c0 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b  Unpacked index k
210d0 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b  ey */.  i64 intK
210e0 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ey,             
210f0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65   /* The table ke
21100 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52  y */.  int biasR
21110 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
21120 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73  /* If true, bias
21130 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74   the search to t
21140 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20  he high end */. 
21150 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20   int *pRes      
21160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
21170 74 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  te search result
21180 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
21190 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
211a0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
211b0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
211c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
211d0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
211e0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
211f0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
21200 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
21210 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
21220 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
21230 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
21240 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
21250 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
21260 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
21270 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
21280 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21290 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e  _VALID && pCur->
212a0 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20 26 26  validNKey .   &&
212b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
212c0 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20  ->intKey .  ){. 
212d0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
212e0 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  o.nKey==intKey )
212f0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
21300 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
21310 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21320 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
21330 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e 69  tLast && pCur->i
21340 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
21350 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
21360 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
21370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
21380 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d   }.  }..  rc = m
21390 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
213a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
213b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
213c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
213d0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
213e0 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge] );.  assert(
213f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
21400 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
21410 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  it );.  if( pCur
21420 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
21430 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
21440 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
21450 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
21460 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
21470 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
21480 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21490 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  _OK;.  }.  asser
214a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
214b0 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 70 49  0]->intKey || pI
214c0 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b  dxKey );.  for(;
214d0 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c  ;){.    int lwr,
214e0 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63   upr;.    Pgno c
214f0 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61  hldPg;.    MemPa
21500 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
21510 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
21520 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 63  Page];.    int c
21530 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20   = -1;  /* pRes 
21540 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20  return if table 
21550 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65  is empty must be
21560 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d   -1 */.    lwr =
21570 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50   0;.    upr = pP
21580 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20  age->nCell-1;.  
21590 20 20 69 66 28 20 28 21 70 50 61 67 65 2d 3e 69    if( (!pPage->i
215a0 6e 74 4b 65 79 20 26 26 20 70 49 64 78 4b 65 79  ntKey && pIdxKey
215b0 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20 29 7b  ==0) || upr<0 ){
215c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
215d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
215e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
215f0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
21600 0a 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67  .    if( biasRig
21610 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ht ){.      pCur
21620 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
21630 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70 72 3b  age] = (u16)upr;
21640 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21650 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
21660 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
21670 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32 29 3b  6)((upr+lwr)/2);
21680 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 3b  .    }.    for(;
21690 3b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 64  ;){.      int id
216a0 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
216b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a  pCur->iPage]; /*
216c0 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
216d0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
216e0 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65  */.      u8 *pCe
216f0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
21700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21710 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65  Pointer to curre
21720 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65  nt cell in pPage
21730 20 2a 2f 0a 0a 20 20 20 20 20 20 70 43 75 72 2d   */..      pCur-
21740 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
21750 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66  .      pCell = f
21760 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
21770 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
21780 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
21790 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
217a0 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ey ){.        i6
217b0 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  4 nCellKey;.    
217c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68      if( pPage->h
217d0 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  asData ){.      
217e0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
217f0 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b           pCell +
21800 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43  = getVarint32(pC
21810 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20  ell, dummy);.   
21820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67       }.        g
21830 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20  etVarint(pCell, 
21840 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29  (u64*)&nCellKey)
21850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43  ;.        if( nC
21860 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29  ellKey==intKey )
21870 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
21880 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
21890 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e   if( nCellKey<in
218a0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
218b0 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    c = -1;.      
218c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
218d0 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
218e0 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  Key>intKey );.  
218f0 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a          c = +1;.
21900 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21910 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
21920 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  y = 1;.        p
21930 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d  Cur->info.nKey =
21940 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
21950 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21960 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
21970 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
21980 7a 65 20 69 73 20 33 32 37 36 38 20 62 79 74 65  ze is 32768 byte
21990 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
219a0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
219b0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
219c0 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
219d0 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
219e0 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
219f0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 61 74     ** page is at
21a00 20 6d 6f 73 74 20 38 31 39 38 20 62 79 74 65 73   most 8198 bytes
21a10 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  , which may be s
21a20 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
21a30 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
21a40 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
21a50 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
21a60 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
21a70 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
21a80 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
21a90 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
21aa0 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
21ab0 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
21ac0 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
21ad0 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
21ae0 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
21af0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
21b00 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
21b10 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
21b20 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
21b30 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21b40 20 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 70     int nCell = p
21b50 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20  Cell[0];.       
21b60 20 69 66 28 20 21 28 6e 43 65 6c 6c 20 26 20 30   if( !(nCell & 0
21b70 78 38 30 29 20 26 26 20 6e 43 65 6c 6c 3c 3d 70  x80) && nCell<=p
21b80 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
21b90 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
21ba0 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
21bb0 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
21bc0 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
21bd0 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
21be0 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
21bf0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
21c00 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
21c10 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
21c20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
21c30 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
21c40 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
21c50 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21c60 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
21c70 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c  void*)&pCell[1],
21c80 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
21c90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70     }else if( !(p
21ca0 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20  Cell[1] & 0x80) 
21cb0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e  .          && (n
21cc0 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30  Cell = ((nCell&0
21cd0 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c  x7f)<<7) + pCell
21ce0 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  [1])<=pPage->max
21cf0 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b  Local.        ){
21d00 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
21d10 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
21d20 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65 20  eld is a 2 byte 
21d30 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72  varint and the r
21d40 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20  ecord .         
21d50 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c   ** fits entirel
21d60 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d  y on the main b-
21d70 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20  tree page.  */. 
21d80 20 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c           c = sql
21d90 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21da0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
21db0 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70  id*)&pCell[2], p
21dc0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
21dd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21de0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
21df0 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20  flows over onto 
21e00 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
21e10 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20  flow pages. In. 
21e20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73           ** this
21e30 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20   case the whole 
21e40 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  cell needs to be
21e50 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65   parsed, a buffe
21e60 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20  r allocated.    
21e70 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63        ** and acc
21e80 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65  essPayload() use
21e90 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68  d to retrieve th
21ea0 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  e record into th
21eb0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  e.          ** b
21ec0 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62  uffer before Vdb
21ed0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
21ee0 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20   can be called. 
21ef0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f 69  */.          voi
21f00 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  d *pCellKey;.   
21f10 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e 73         u8 * cons
21f20 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70 43  t pCellBody = pC
21f30 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68 69  ell - pPage->chi
21f40 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
21f50 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
21f60 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
21f70 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20  age, pCellBody, 
21f80 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
21f90 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
21fa0 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  (int)pCur->info.
21fb0 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nKey;.          
21fc0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
21fd0 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 20  e3Malloc( nCell 
21fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21ff0 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
22000 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22010 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
22020 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
22030 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
22040 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22050 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73       rc = access
22060 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c  Payload(pCur, 0,
22070 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65   nCell, (unsigne
22080 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79  d char*)pCellKey
22090 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
220a0 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64     c = sqlite3Vd
220b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
220c0 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c  nCell, pCellKey,
220d0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
220e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
220f0 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
22100 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
22110 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
22120 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
22130 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22140 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
22150 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
22160 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
22170 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  f ){.          l
22180 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20  wr = idx;.      
22190 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20      upr = lwr - 
221a0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
221b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
221c0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  e{.          *pR
221d0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
221e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
221f0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
22200 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a   moveto_finish;.
22210 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22220 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c 30 20  }.      if( c<0 
22230 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d  ){.        lwr =
22240 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65   idx+1;.      }e
22250 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
22260 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
22270 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e  }.      if( lwr>
22280 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 62  upr ){.        b
22290 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
222a0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
222b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
222c0 75 31 36 29 28 28 6c 77 72 2b 75 70 72 29 2f 32  u16)((lwr+upr)/2
222d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
222e0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
222f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22300 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
22310 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
22320 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
22330 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
22340 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
22350 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
22360 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
22370 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
22380 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
22390 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
223a0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
223b0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
223c0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
223d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
223e0 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
223f0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
22400 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
22410 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
22420 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
22430 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66  Cell );.      if
22440 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
22450 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
22460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
22470 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
22480 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  sh;.    }.    pC
22490 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
224a0 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77  iPage] = (u16)lw
224b0 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  r;.    pCur->inf
224c0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
224d0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
224e0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d   = 0;.    rc = m
224f0 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
22500 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
22510 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
22520 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d  to_finish;.  }.m
22530 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20  oveto_finish:.  
22540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22550 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
22560 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
22570 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
22580 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
22590 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
225a0 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
225b0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
225c0 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
225d0 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
225e0 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
225f0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
22600 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
22610 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
22620 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
22630 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
22640 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
22650 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
22660 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
22670 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
22680 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
22690 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
226a0 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
226b0 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
226c0 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
226d0 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
226e0 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
226f0 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
22700 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
22710 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
22720 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
22730 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
22740 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
22750 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
22760 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
22770 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
22780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22790 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
227a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
227b0 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
227c0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
227d0 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
227e0 65 5b 31 35 30 5d 3b 20 20 20 20 20 20 20 20 20  e[150];         
227f0 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
22800 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
22810 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
22820 2f 0a 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29  /...  if( pKey )
22830 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b  {.    assert( nK
22840 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b  ey==(i64)(int)nK
22850 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65  ey );.    pIdxKe
22860 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  y = sqlite3VdbeR
22870 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72  ecordUnpack(pCur
22880 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74  ->pKeyInfo, (int
22890 29 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20  )nKey, pKey,.   
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65 6f     aSpace, sizeo
228d0 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20 20  f(aSpace));.    
228e0 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29  if( pIdxKey==0 )
228f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22900 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
22910 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b 0a     pIdxKey = 0;.
22920 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
22930 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
22940 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64 78  acked(pCur, pIdx
22950 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73 2c  Key, nKey, bias,
22960 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70 4b   pRes);.  if( pK
22970 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
22980 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63  3VdbeDeleteUnpac
22990 6b 65 64 52 65 63 6f 72 64 28 70 49 64 78 4b 65  kedRecord(pIdxKe
229a0 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  y);.  }.  return
229b0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
229c0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
229d0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
229e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
229f0 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
22a00 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
22a10 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
22a20 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
22a30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
22a40 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
22a50 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
22a60 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
22a70 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
22a80 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
22a90 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
22aa0 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
22ab0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
22ac0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
22ad0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22ae0 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
22af0 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
22b00 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
22b10 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
22b20 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
22b30 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
22b40 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
22b50 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
22b60 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
22b70 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
22b80 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
22b90 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
22ba0 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
22bb0 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
22bc0 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
22bd0 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
22be0 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
22bf0 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
22c00 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
22c10 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
22c20 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
22c30 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
22c40 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
22c50 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
22c60 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
22c70 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
22c80 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
22c90 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
22ca0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
22cb0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
22cc0 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
22cd0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
22ce0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
22cf0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
22d00 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
22d10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
22d20 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
22d30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
22d40 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
22d50 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
22d60 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
22d70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22d80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22d90 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
22da0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
22db0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
22dc0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
22dd0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
22de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22df0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
22e00 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
22e10 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
22e20 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
22e30 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
22e40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
22e50 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
22e60 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
22e70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
22e80 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
22e90 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
22ea0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
22eb0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
22ec0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
22ed0 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
22ee0 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
22ef0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
22f00 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
22f10 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
22f20 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
22f30 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
22f40 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
22f50 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
22f60 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
22f70 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
22f80 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
22f90 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
22fa0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22fb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
22fc0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
22fd0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
22fe0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22ff0 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
23000 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
23010 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
23020 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
23030 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
23040 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
23050 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23060 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23070 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23080 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
23090 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
230a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
230b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
230c0 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
230d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
230e0 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
230f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
23100 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
23110 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
23120 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23130 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
23140 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
23150 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
23160 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
23170 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
23180 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
23190 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
231a0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
231b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
231c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
231d0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
231e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
231f0 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
23200 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
23210 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
23220 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
23230 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
23240 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
23250 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
23260 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
23270 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
23280 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
23290 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
232a0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
232b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
232c0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
232d0 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
232e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
232f0 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
23300 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
23310 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
23320 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
23330 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23340 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23350 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
23360 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
23370 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
23380 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23390 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
233a0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
233b0 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
233c0 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
233d0 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
233e0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
233f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23400 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
23410 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
23420 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
23430 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
23440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23450 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
23460 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
23470 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
23480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
23490 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
234a0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
234b0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
234c0 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
234d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
234e0 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
234f0 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
23500 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
23510 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
23520 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
23530 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
23540 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
23550 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
23560 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
23570 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
23580 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
23590 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
235a0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
235b0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
235c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
235d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
235e0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
235f0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
23600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23610 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23620 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
23630 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
23640 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
23650 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
23660 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
23670 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
23680 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
23690 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
236a0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
236b0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
236c0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
236d0 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
236e0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
236f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
23700 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
23710 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23720 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
23730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
23740 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
23750 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
23760 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
23770 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
23780 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
23790 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
237a0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
237b0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
237c0 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
237d0 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
237e0 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
237f0 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
23800 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
23810 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
23820 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
23830 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
23840 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
23850 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
23860 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
23870 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
23880 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
23890 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
238a0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
238b0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
238c0 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
238d0 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
238e0 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
238f0 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
23900 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
23910 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
23920 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
23930 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
23940 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
23950 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
23960 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
23970 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
23980 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
23990 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
239a0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
239b0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
239c0 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
239d0 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
239e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
239f0 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
23a00 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
23a10 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
23a20 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
23a30 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
23a40 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
23a50 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
23a60 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
23a70 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
23a80 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
23a90 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
23aa0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
23ab0 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
23ac0 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
23ad0 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
23ae0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
23af0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
23b00 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
23b10 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
23b20 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
23b30 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
23b40 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
23b50 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
23b60 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
23b70 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
23b80 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
23b90 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
23ba0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
23bb0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
23bc0 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
23bd0 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
23be0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
23bf0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
23c00 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
23c10 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
23c20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
23c30 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
23c40 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
23c50 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
23c60 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
23c70 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
23c80 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
23c90 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
23ca0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
23cb0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
23cc0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
23cd0 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
23ce0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
23cf0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
23d00 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
23d10 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
23d20 78 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  xPage = pagerPag
23d30 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 6e  ecount(pBt);.  n
23d40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
23d50 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
23d60 0a 20 20 69 66 28 20 6e 3e 6d 78 50 61 67 65 20  .  if( n>mxPage 
23d70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
23d80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
23d90 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  T;.  }.  if( n>0
23da0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
23db0 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68   are pages on th
23dc0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75  e freelist.  Reu
23dd0 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  se one of those 
23de0 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67  pages. */.    Pg
23df0 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75  no iTrunk;.    u
23e00 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30  8 searchList = 0
23e10 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65  ; /* If the free
23e20 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65  -list must be se
23e30 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72  arched for 'near
23e40 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  by' */.    .    
23e50 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74  /* If the 'exact
23e60 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20  ' parameter was 
23e70 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79  true and a query
23e80 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
23e90 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
23ea0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
23eb0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
23ec0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
23ed0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
23ee0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
23ef0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
23f00 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
23f10 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
23f20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
23f30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
23f40 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79   exact && nearby
23f50 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  <=mxPage ){.    
23f60 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
23f70 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
23f80 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
23f90 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
23fa0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
23fb0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
23fc0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
23fd0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
23fe0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
23ff0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
24000 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
24010 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
24020 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
24030 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
24040 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
24050 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
24060 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
24070 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
24080 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
24090 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
240a0 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
240b0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
240c0 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
240d0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
240e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
240f0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24100 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
24110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
24120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24130 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
24140 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
24150 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
24160 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
24170 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
24180 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
24190 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
241a0 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
241b0 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
241c0 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
241d0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
241e0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
241f0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
24200 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
24210 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
24220 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
24230 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
24240 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
24250 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
24260 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
24270 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
24280 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
24290 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
242a0 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
242b0 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
242c0 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
242d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
242e0 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  ( iTrunk>mxPage 
242f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
24300 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24310 4b 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  KPT;.      }else
24320 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
24330 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
24340 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20  ge(pBt, iTrunk, 
24350 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  &pTrunk, 0);.   
24360 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
24370 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
24380 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
24390 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
243a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
243b0 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
243c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
243d0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
243e0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
243f0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
24400 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
24410 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
24420 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
24430 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
24440 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
24450 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
24460 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
24470 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
24480 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
24490 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
244a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
244b0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
244c0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
244d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
244e0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
244f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
24500 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
24510 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
24520 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
24530 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
24540 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
24550 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
24560 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
24570 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
24580 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
24590 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
245a0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
245b0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
245c0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
245d0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
245e0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
245f0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
24600 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
24610 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
24620 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
24630 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
24640 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
24650 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
24660 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
24670 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24680 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24690 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
246a0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
246b0 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
246c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
246d0 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  M.      }else if
246e0 28 20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20  ( searchList && 
246f0 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29  nearby==iTrunk )
24700 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
24710 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73   list is being s
24720 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73  earched and this
24730 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74   trunk page is t
24740 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
24750 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20  ** to allocate, 
24760 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
24770 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61  ether it has lea
24780 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ves..        */.
24790 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
247a0 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29  *pPgno==iTrunk )
247b0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
247c0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
247d0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
247e0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
247f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
24800 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
24810 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
24820 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
24830 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
24840 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
24850 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
24860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
24870 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
24880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24890 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
248a0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
248b0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
248c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
248d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  e{.            m
248e0 65 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e  emcpy(&pPrevTrun
248f0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54  k->aData[0], &pT
24900 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
24910 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  4);.          }.
24920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24930 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24940 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65  trunk page is re
24950 71 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61  quired by the ca
24960 6c 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74  ller but it cont
24970 61 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20  ains .          
24980 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66  ** pointers to f
24990 72 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e  ree-list leaves.
249a0 20 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20   The first leaf 
249b0 62 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a  becomes a trunk.
249c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67            ** pag
249d0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  e in this case..
249e0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
249f0 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
24a00 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20  pNewTrunk;.     
24a10 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72       Pgno iNewTr
24a20 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
24a30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  pTrunk->aData[8]
24a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
24a50 20 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67   iNewTrunk>mxPag
24a60 65 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  e ){ .          
24a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
24a80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
24a90 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
24aa0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
24ab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24ac0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
24ad0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
24ae0 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
24af0 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
24b00 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
24b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24b20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
24b30 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
24b40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
24b50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
24b60 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
24b70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
24b80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
24b90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
24ba0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
24bb0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
24bc0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
24bd0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
24be0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
24bf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24c00 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
24c10 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
24c20 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
24c30 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
24c40 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
24c50 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
24c60 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
24c70 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
24c80 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
24c90 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
24ca0 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
24cb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
24cc0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
24cd0 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
24ce0 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
24cf0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
24d00 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
24d10 62 6c 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ble(pPage1->pDbP
24d20 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
24d30 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
24d40 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
24d50 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
24d60 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24d70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
24d80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24d90 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
24da0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
24db0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
24dc0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
24dd0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
24de0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
24df0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
24e00 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
24e10 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
24e20 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
24e30 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
24e40 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
24e50 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
24e60 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
24e70 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
24e80 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
24e90 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
24ea0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
24eb0 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20   if( k>0 ){.    
24ec0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
24ed0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
24ee0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
24ef0 75 33 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  u32 closest;.   
24f00 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
24f10 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
24f20 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
24f30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
24f40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
24f50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
24f60 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
24f70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
24f80 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
24f90 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
24fa0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
24fb0 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
24fc0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
24fd0 75 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20  u32 i;.         
24fe0 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
24ff0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
25000 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69 73 74  ;.          dist
25010 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
25020 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b  ta[8]) - nearby;
25030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64  .          if( d
25040 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d 20 2d  ist<0 ) dist = -
25050 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
25060 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
25070 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
25080 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62 79 74  int d2 = get4byt
25090 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29  e(&aData[8+i*4])
250a0 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20   - nearby;.     
250b0 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 30 20         if( d2<0 
250c0 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20  ) d2 = -d2;.    
250d0 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c 64          if( d2<d
250e0 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ist ){.         
250f0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69       closest = i
25100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25110 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20  dist = d2;.     
25120 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25130 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
25140 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c  se{.          cl
25150 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  osest = 0;.     
25160 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50     }..        iP
25170 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
25180 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
25190 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  4]);.        if(
251a0 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b   iPage>mxPage ){
251b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
251c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
251d0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  KPT;.          g
251e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
251f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
25200 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
25210 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
25220 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
25230 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f 6e         int noCon
25240 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20 20  tent;.          
25250 50 67 6e 6f 20 6e 50 61 67 65 3b 0a 20 20 20 20  Pgno nPage;.    
25260 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
25270 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
25280 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
25290 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20  ecount(pBt);.   
252a0 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
252b0 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
252c0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
252d0 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
252e0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
252f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
25300 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25310 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
25320 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
25330 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
25340 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
25350 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
25360 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
25370 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
25380 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
25390 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
253a0 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
253b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
253c0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
253d0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
253e0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
253f0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
25400 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
25410 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
25420 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
25430 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
25440 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25450 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
25460 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
25470 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
25480 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
25490 73 77 72 69 74 65 61 62 6c 65 28 70 54 72 75 6e  swriteable(pTrun
254a0 6b 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  k->pDbPage) );. 
254b0 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65           noConte
254c0 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61  nt = !btreeGetHa
254d0 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70  sContent(pBt, *p
254e0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  Pgno);.         
254f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
25500 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a  eeGetPage(pBt, *
25510 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
25520 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
25530 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25540 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25550 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
25560 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
25570 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
25580 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
25590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
255a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
255b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
255c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
255d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
255e0 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
255f0 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
25600 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25610 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
25620 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
25630 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
25640 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
25650 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
25660 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
25670 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
25680 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
25690 73 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  so create a new 
256a0 70 61 67 65 20 61 74 20 74 68 65 0a 20 20 20 20  page at the.    
256b0 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
256c0 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50  le */.    int nP
256d0 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
256e0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 2a  ount(pBt);.    *
256f0 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20  pPgno = nPage + 
25700 31 3b 0a 0a 20 20 20 20 69 66 28 20 2a 70 50 67  1;..    if( *pPg
25710 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no==PENDING_BYTE
25720 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
25730 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a      (*pPgno)++;.
25740 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
25750 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
25760 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
25770 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
25780 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
25790 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20  Bt, *pPgno) ){. 
257a0 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e       /* If *pPgn
257b0 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f  o refers to a po
257c0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
257d0 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77  allocate two new
257e0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
257f0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
25800 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  e file instead o
25810 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74  f one. The first
25820 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a   allocated page.
25830 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73        ** becomes
25840 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d   a new pointer-m
25850 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63  ap page, the sec
25860 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74  ond is used by t
25870 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20  he caller..     
25880 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
25890 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20  e *pPg = 0;.    
258a0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
258b0 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
258c0 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72  of file (pointer
258d0 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a  -map page)\n", *
258e0 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61  pPgno));.      a
258f0 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
25900 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
25910 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
25920 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
25930 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50  GetPage(pBt, *pP
25940 67 6e 6f 2c 20 26 70 50 67 2c 20 30 29 3b 0a 20  gno, &pPg, 0);. 
25950 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25960 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
25980 67 65 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44  gerWrite(pPg->pD
25990 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
259a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 67 29  releasePage(pPg)
259b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
259c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
259d0 72 63 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e  rc;.      (*pPgn
259e0 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  o)++;.      if( 
259f0 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
25a00 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
25a10 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a  { (*pPgno)++; }.
25a20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
25a30 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
25a40 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
25a50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20  AGE(pBt) );.    
25a60 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
25a70 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 2a 70  eGetPage(pBt, *p
25a80 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30 29  Pgno, ppPage, 0)
25a90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
25aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63  eturn rc;.    rc
25ab0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25ac0 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e  rite((*ppPage)->
25ad0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
25ae0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25af0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
25b00 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
25b10 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
25b20 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
25b30 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
25b40 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
25b50 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
25b60 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
25b70 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
25b80 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
25b90 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
25ba0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
25bb0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
25bc0 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  k);.  if( rc==SQ
25bd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
25be0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
25bf0 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
25c00 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
25c10 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
25c20 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
25c30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
25c40 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
25c50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
25c60 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
25c70 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
25c80 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
25c90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
25ca0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25cb0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
25cc0 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20   add page iPage 
25cd0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
25ce0 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20  file free-list. 
25cf0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
25d00 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  d that the page 
25d10 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61  is not already a
25d20 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65   part of the fre
25d30 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  e-list..**.** Th
25d40 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  e value passed a
25d50 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
25d60 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
25d70 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e  nction is option
25d80 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61  al..** If the ca
25d90 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20  ller happens to 
25da0 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74  have a pointer t
25db0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62  o the MemPage ob
25dc0 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70  ject .** corresp
25dd0 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69  onding to page i
25de0 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d  Page handy, it m
25df0 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68  ay pass it as th
25e00 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20  e second value. 
25e10 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
25e20 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e  t may pass NULL.
25e30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e  .**.** If a poin
25e40 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65  ter to a MemPage
25e50 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65   object is passe
25e60 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
25e70 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73  argument,.** its
25e80 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
25e90 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20   is not altered 
25ea0 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
25eb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25ec0 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72  freePage2(BtShar
25ed0 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65  ed *pBt, MemPage
25ee0 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f   *pMemPage, Pgno
25ef0 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61   iPage){.  MemPa
25f00 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20  ge *pTrunk = 0; 
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25f20 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  * Free-list trun
25f30 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  k page */.  Pgno
25f40 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20   iTrunk = 0;    
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f60 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
25f70 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  f free-list trun
25f80 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d  k page */ .  Mem
25f90 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70  Page *pPage1 = p
25fa0 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20  Bt->pPage1;     
25fb0 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65   /* Local refere
25fc0 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f  nce to page 1 */
25fd0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25fe0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
25ff0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62         /* Page b
26000 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20  eing freed. May 
26010 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e  be NULL. */.  in
26020 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
26030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26040 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
26050 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
26060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69            /* Ini
26080 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  tial number of p
26090 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73  ages on free-lis
260a0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
260b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
260c0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
260d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 50 61 67  ;.  assert( iPag
260e0 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>1 );.  assert(
260f0 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d   !pMemPage || pM
26100 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50  emPage->pgno==iP
26110 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 70 4d  age );..  if( pM
26120 65 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50  emPage ){.    pP
26130 61 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a  age = pMemPage;.
26140 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26150 52 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61  Ref(pPage->pDbPa
26160 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
26170 20 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50    pPage = btreeP
26180 61 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69  ageLookup(pBt, i
26190 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Page);.  }..  /*
261a0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
261b0 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
261c0 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
261d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
261e0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
261f0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
26200 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
26210 6f 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67  out;.  nFree = g
26220 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
26230 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
26240 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
26250 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65  >aData[36], nFre
26260 65 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  e+1);..#ifdef SQ
26270 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
26280 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
26290 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
262a0 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
262b0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
262c0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
262d0 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
262e0 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
262f0 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
26300 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ros..  */.  if( 
26310 28 21 70 50 61 67 65 20 26 26 20 28 72 63 20 3d  (!pPage && (rc =
26320 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
26330 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
26340 20 26 70 50 61 67 65 2c 20 30 29 29 29 0a 20 20   &pPage, 0))).  
26350 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28   ||            (
26360 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26370 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
26380 62 50 61 67 65 29 29 0a 20 20 29 7b 0a 20 20 20  bPage)).  ){.   
26390 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
263a0 75 74 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  ut;.  }.  memset
263b0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
263c0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
263d0 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a  geSize);.#endif.
263e0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
263f0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
26400 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69 74  uto-vacuum, writ
26410 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  e an entry in th
26420 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20  e pointer-map.  
26430 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ** to indicate t
26440 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
26450 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  free..  */.  if(
26460 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
26470 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
26480 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
26490 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
264a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
264b0 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f  ) goto freepage_
264c0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  out;.  }..  /* N
264d0 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68  ow manipulate th
264e0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
264f0 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74 72 75  e free-list stru
26500 63 74 75 72 65 2e 20 54 68 65 72 65 20 61 72 65  cture. There are
26510 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62   two.  ** possib
26520 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68 65 20  ilities. If the 
26530 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63 75 72  free-list is cur
26540 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72  rently empty, or
26550 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 20 20   if the first.  
26560 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  ** trunk page in
26570 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
26580 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69  s full, then thi
26590 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65 63 6f  s page will beco
265a0 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72  me a.  ** new fr
265b0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
265c0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ge. Otherwise, i
265d0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20  t will become a 
265e0 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a  leaf of the.  **
265f0 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67   first trunk pag
26600 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
26610 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
26620 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69 66 20   block tests if 
26630 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69  it.  ** is possi
26640 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 20 70  ble to add the p
26650 61 67 65 20 61 73 20 61 20 6e 65 77 20 66 72 65  age as a new fre
26660 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a  e-list leaf..  *
26670 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21 3d 30  /.  if( nFree!=0
26680 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 61   ){.    int nLea
26690 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
266a0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d    /* Initial num
266b0 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c  ber of leaf cell
266c0 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  s on trunk page 
266d0 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  */..    iTrunk =
266e0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
266f0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20  1->aData[32]);. 
26700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
26710 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
26720 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
26730 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
26740 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26750 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
26760 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
26770 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
26780 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
26790 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20  ta[4]);.    if( 
267a0 6e 4c 65 61 66 3c 30 20 29 7b 0a 20 20 20 20 20  nLeaf<0 ){.     
267b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
267c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
267d0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
267e0 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ut;.    }.    if
267f0 28 20 6e 4c 65 61 66 3c 70 42 74 2d 3e 75 73 61  ( nLeaf<pBt->usa
26800 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
26810 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69  .      /* In thi
26820 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
26830 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e  room on the trun
26840 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74  k page to insert
26850 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
26860 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61  ** being freed a
26870 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20  s a new leaf..  
26880 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
26890 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72  Note that the tr
268a0 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20  unk page is not 
268b0 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69  really full unti
268c0 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  l it contains.  
268d0 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a      ** usableSiz
268e0 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c  e/4 - 2 entries,
268f0 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f   not usableSize/
26900 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73  4 - 8 entries as
26910 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a   we have.      *
26920 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75  * coded.  But du
26930 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
26940 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20  ror in versions 
26950 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20  of SQLite prior 
26960 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e  to.      ** 3.6.
26970 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74  0, databases wit
26980 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  h freelist trunk
26990 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d   pages holding m
269a0 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a  ore than.      *
269b0 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  * usableSize/4 -
269c0 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20   8 entries will 
269d0 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63  be reported as c
269e0 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65  orrupt.  In orde
269f0 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61  r.      ** to ma
26a00 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73  intain backwards
26a10 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
26a20 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  ith older versio
26a30 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20  ns of SQLite,.  
26a40 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63      ** we will c
26a50 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72 69  ontain to restri
26a60 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
26a70 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
26a80 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
26a90 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
26aa0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
26ab0 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
26ac0 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
26ad0 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
26ae0 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
26af0 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
26b00 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
26b10 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
26b20 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
26b30 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
26b40 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
26b50 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
26b60 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  "..      */.    
26b70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26b80 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
26b90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26ba0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26bb0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
26bc0 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
26bd0 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b  aData[4], nLeaf+
26be0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
26bf0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
26c00 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20  ata[8+nLeaf*4], 
26c10 69 50 61 67 65 29 3b 0a 23 69 66 6e 64 65 66 20  iPage);.#ifndef 
26c20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
26c30 4c 45 54 45 0a 20 20 20 20 20 20 20 20 69 66 28  LETE.        if(
26c40 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20   pPage ){.      
26c50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26c60 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
26c70 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
26c80 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
26c90 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 53 65      rc = btreeSe
26ca0 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c  tHasContent(pBt,
26cb0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d   iPage);.      }
26cc0 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46  .      TRACE(("F
26cd0 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65 61  REE-PAGE: %d lea
26ce0 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65 20  f on trunk page 
26cf0 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e  %d\n",pPage->pgn
26d00 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  o,pTrunk->pgno))
26d10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65  ;.      goto fre
26d20 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  epage_out;.    }
26d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f  .  }..  /* If co
26d40 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74  ntrol flows to t
26d50 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
26d60 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73 73 69  it was not possi
26d70 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65 0a 20  ble to add the. 
26d80 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62 65 69   ** the page bei
26d90 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6c 65  ng freed as a le
26da0 61 66 20 70 61 67 65 20 6f 66 20 74 68 65 20 66  af page of the f
26db0 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68  irst trunk in th
26dc0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a  e free-list..  *
26dd0 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63 61 75  * Possibly becau
26de0 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  se the free-list
26df0 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f   is empty, or po
26e00 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
26e10 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74 20 74  he .  ** first t
26e20 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
26e30 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e 20 45  -list is full. E
26e40 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20 70  ither way, the p
26e50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 0a  age being freed.
26e60 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65    ** will become
26e70 20 74 68 65 20 6e 65 77 20 66 69 72 73 74 20 74   the new first t
26e80 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
26e90 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f   free-list..  */
26ea0 0a 20 20 69 66 28 20 20 20 28 28 21 70 50 61 67  .  if(   ((!pPag
26eb0 65 29 20 26 26 20 28 30 20 21 3d 20 28 72 63 20  e) && (0 != (rc 
26ec0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
26ed0 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
26ee0 2c 20 26 70 50 61 67 65 2c 20 30 29 29 29 29 0a  , &pPage, 0)))).
26ef0 20 20 20 20 20 7c 7c 20 28 30 20 21 3d 20 28 72       || (0 != (r
26f00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26f10 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
26f20 50 61 67 65 29 29 29 0a 20 20 29 7b 0a 20 20 20  Page))).  ){.   
26f30 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
26f40 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
26f50 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
26f60 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
26f70 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
26f80 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
26f90 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
26fa0 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
26fb0 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
26fc0 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
26fd0 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
26fe0 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
26ff0 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
27000 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
27010 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
27020 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
27030 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
27040 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
27050 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
27060 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
27070 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
27080 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
27090 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  e *pPage){.  ret
270a0 75 72 6e 20 66 72 65 65 50 61 67 65 32 28 70 50  urn freePage2(pP
270b0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
270c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d   pPage->pgno);.}
270d0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
270e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
270f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27100 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
27110 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
27120 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
27130 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
27140 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
27150 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
27160 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
27170 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
27180 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
27190 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
271a0 4f 76 66 6c 3b 0a 20 20 75 31 36 20 6f 76 66 6c  Ovfl;.  u16 ovfl
271b0 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
271c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
271d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
271e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
271f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
27200 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
27210 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
27220 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
27230 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
27240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
27250 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
27260 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
27270 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
27280 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
27290 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
272a0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
272b0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
272c0 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
272d0 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
272e0 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
272f0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
27300 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
27310 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
27320 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
27330 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
27340 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
27350 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30  ert( ovflPgno==0
27360 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20   || nOvfl>0 );. 
27370 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20   while( nOvfl-- 
27380 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e 65 78  ){.    Pgno iNex
27390 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d 50 61  t = 0;.    MemPa
273a0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
273b0 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3c     if( ovflPgno<
273c0 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  2 || ovflPgno>pa
273d0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
273e0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 30 20  ) ){.      /* 0 
273f0 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c 20 70  is not a legal p
27400 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 70  age number and p
27410 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62 65 20  age 1 cannot be 
27420 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  an .      ** ove
27430 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68 65 72  rflow page. Ther
27440 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50 67 6e  efore if ovflPgn
27450 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68 65 20  o<2 or past the 
27460 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20 20 20  end of the .    
27470 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20 64 61    ** file the da
27480 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63  tabase must be c
27490 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 20  orrupt. */.     
274a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
274b0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
274c0 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76 66 6c   }.    if( nOvfl
274d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
274e0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
274f0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
27500 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b 0a 20  Ovfl, &iNext);. 
27510 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
27520 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
27530 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
27540 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
27550 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  flPgno);.    if(
27560 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
27570 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
27580 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
27590 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
275a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
275b0 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
275c0 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
275d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
275e0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
275f0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
27600 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
27610 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
27620 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
27630 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
27640 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
27650 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
27660 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
27670 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
27680 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
27690 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
276a0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
276b0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
276c0 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
276d0 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
276e0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
276f0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
27700 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
27710 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
27720 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
27730 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
27740 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
27750 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
27760 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
27770 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
27780 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
27790 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
277a0 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
277b0 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
277c0 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
277d0 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
277e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
277f0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
27800 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
27810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27820 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
27830 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
27840 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
27850 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
27860 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
27870 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
27880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
27890 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
278a0 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
278b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
278c0 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61  *pData,int nData
278d0 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  ,   /* The data 
278e0 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20  */.  int nZero, 
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27900 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72      /* Extra zer
27910 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  o bytes to appen
27920 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20  d to pData */.  
27930 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  int *pnSize     
27940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27950 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a  * Write cell siz
27960 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  e here */.){.  i
27970 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63  nt nPayload;.  c
27980 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20  onst u8 *pSrc;. 
27990 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63   int nSrc, n, rc
279a0 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66  ;.  int spaceLef
279b0 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  t;.  MemPage *pO
279c0 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  vfl = 0;.  MemPa
279d0 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d  ge *pToRelease =
279e0 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
279f0 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75  har *pPrior;.  u
27a00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
27a10 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72  ayload;.  BtShar
27a20 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
27a30 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  >pBt;.  Pgno pgn
27a40 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  oOvfl = 0;.  int
27a50 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c   nHeader;.  Cell
27a60 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73  Info info;..  as
27a70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
27a80 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
27a90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
27aa0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
27ab0 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
27ac0 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
27ad0 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
27ae0 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
27af0 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
27b00 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
27b10 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
27b20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
27b30 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
27b40 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
27b50 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
27b60 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
27b70 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
27b80 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
27b90 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
27ba0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  e) );..  /* Fill
27bb0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20   in the header. 
27bc0 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30  */.  nHeader = 0
27bd0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
27be0 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61  leaf ){.    nHea
27bf0 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20  der += 4;.  }.  
27c00 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61  if( pPage->hasDa
27c10 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  ta ){.    nHeade
27c20 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
27c30 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
27c40 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20  nData+nZero);.  
27c50 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61  }else{.    nData
27c60 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20   = nZero = 0;.  
27c70 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70  }.  nHeader += p
27c80 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
27c90 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a  nHeader], *(u64*
27ca0 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74  )&nKey);.  sqlit
27cb0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
27cc0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
27cd0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65  , &info);.  asse
27ce0 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72  rt( info.nHeader
27cf0 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61  ==nHeader );.  a
27d00 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79  ssert( info.nKey
27d10 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ==nKey );.  asse
27d20 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d  rt( info.nData==
27d30 28 75 33 32 29 28 6e 44 61 74 61 2b 6e 5a 65 72  (u32)(nData+nZer
27d40 6f 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46 69  o) );.  .  /* Fi
27d50 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61  ll in the payloa
27d60 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20  d */.  nPayload 
27d70 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
27d80 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
27d90 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63  tKey ){.    pSrc
27da0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53   = pData;.    nS
27db0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
27dc0 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c  nData = 0;.  }el
27dd0 73 65 7b 20 0a 20 20 20 20 69 66 28 20 6e 4b 65  se{ .    if( nKe
27de0 79 3e 30 78 37 66 66 66 66 66 66 66 20 7c 7c 20  y>0x7fffffff || 
27df0 70 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pKey==0 ){.     
27e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27e10 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20  ORRUPT;.    }.  
27e20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 28 69    nPayload += (i
27e30 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  nt)nKey;.    pSr
27e40 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53  c = pKey;.    nS
27e50 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  rc = (int)nKey;.
27e60 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20    }.  *pnSize = 
27e70 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70  info.nSize;.  sp
27e80 61 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e  aceLeft = info.n
27e90 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61  Local;.  pPayloa
27ea0 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  d = &pCell[nHead
27eb0 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20  er];.  pPrior = 
27ec0 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
27ed0 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65  rflow];..  while
27ee0 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
27ef0 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
27f00 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
27f10 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27f20 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
27f30 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
27f40 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
27f50 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
27f60 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
27f70 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
27f80 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
27f90 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
27fa0 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
27fb0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
27fc0 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
27fd0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
27fe0 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
27ff0 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
28000 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
28010 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
28020 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
28030 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
28040 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
28050 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
28060 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
28070 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
28080 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
28090 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
280a0 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
280b0 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
280c0 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
280d0 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
280e0 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
280f0 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
28100 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
28110 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
28120 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
28130 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
28140 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
28150 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
28160 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
28170 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
28180 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
28190 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
281a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
281b0 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
281c0 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
281d0 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
281e0 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
281f0 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
28200 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
28210 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
28220 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
28230 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
28240 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64 20  e uninitialised 
28250 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
28260 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
28270 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
28280 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
28290 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
282a0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
282b0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
282c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
282d0 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
282e0 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
282f0 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
28300 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
28310 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
28320 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
28330 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29  ype, pgnoPtrmap)
28340 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
28360 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
28370 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28380 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
28390 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
283a0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
283b0 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
283c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
283d0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
283e0 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
283f0 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
28400 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
28410 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
28420 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
28430 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
28440 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
28450 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
28460 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
28470 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
28480 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
28490 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
284a0 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
284b0 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
284c0 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
284d0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
284e0 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
284f0 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
28500 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
28510 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
28520 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
28530 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
28540 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
28550 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
28560 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
28570 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
28580 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28590 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
285a0 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
285b0 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
285c0 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
285d0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
285e0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
285f0 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
28600 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
28610 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
28620 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
28630 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
28640 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
28650 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
28660 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
28670 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
28680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
28690 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
286a0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
286b0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
286c0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
286d0 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
286e0 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
286f0 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
28700 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
28710 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
28720 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
28730 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
28740 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
28750 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
28760 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
28770 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
28780 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
28790 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
287a0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
287b0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
287c0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
287d0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
287e0 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
287f0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
28800 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
28810 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
28820 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
28830 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
28840 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
28850 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
28860 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
28870 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
28880 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
28890 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
288a0 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
288b0 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
288c0 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
288d0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
288e0 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
288f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28900 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
28910 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
28920 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
28930 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
28940 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
28950 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
28960 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
28970 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
28980 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
28990 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
289a0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
289b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
289c0 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
289d0 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
289e0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
289f0 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
28a00 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
28a10 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
28a20 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
28a30 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
28a40 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
28a50 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
28a60 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
28a70 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
28a80 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
28a90 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
28aa0 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
28ab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
28ac0 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
28ad0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
28ae0 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
28af0 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
28b00 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
28b10 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
28b20 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
28b30 20 69 6e 74 20 64 72 6f 70 43 65 6c 6c 28 4d 65   int dropCell(Me
28b40 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
28b50 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
28b60 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
28b70 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
28b80 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
28b90 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
28ba0 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
28bb0 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
28bc0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
28bd0 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
28be0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
28bf0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
28c00 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
28c10 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
28c20 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  thin data[] */. 
28c30 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
28c40 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
28c50 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
28c60 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c  ( idx>=0 && idx<
28c70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
28c80 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65    assert( sz==ce
28c90 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64  llSize(pPage, id
28ca0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
28cb0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28cc0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
28cd0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
28ce0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
28cf0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
28d00 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
28d10 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
28d20 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61  ata;.  ptr = &da
28d30 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
28d40 66 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20  fset + 2*idx];. 
28d50 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
28d60 74 72 29 3b 0a 20 20 69 66 28 20 28 70 63 3c 70  tr);.  if( (pc<p
28d70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
28d80 36 2b 28 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30  6+(pPage->leaf?0
28d90 3a 34 29 29 0a 20 20 20 20 20 7c 7c 20 28 70 63  :4)).     || (pc
28da0 2b 73 7a 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e  +sz>pPage->pBt->
28db0 75 73 61 62 6c 65 53 69 7a 65 29 20 29 7b 0a 20  usableSize) ){. 
28dc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28dd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
28de0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
28df0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
28e00 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  z);.  if( rc!=SQ
28e10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
28e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
28e30 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70  for(i=idx+1; i<p
28e40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  Page->nCell; i++
28e50 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70  , ptr+=2){.    p
28e60 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a  tr[0] = ptr[2];.
28e70 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72      ptr[1] = ptr
28e80 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  [3];.  }.  pPage
28e90 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74  ->nCell--;.  put
28ea0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
28eb0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c  e->hdrOffset+3],
28ec0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a   pPage->nCell);.
28ed0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
28ee0 3d 20 32 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 2;.  return SQ
28ef0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
28f00 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63  * Insert a new c
28f10 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20  ell on pPage at 
28f20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20  cell index "i". 
28f30 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   pCell points to
28f40 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   the.** content 
28f50 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a  of the cell..**.
28f60 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63  ** If the cell c
28f70 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20  ontent will fit 
28f80 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  on the page, the
28f90 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20  n put it there. 
28fa0 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e   If it.** will n
28fb0 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b  ot fit, then mak
28fc0 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
28fd0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74  cell content int
28fe0 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54  o pTemp if.** pT
28ff0 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e  emp is not null.
29000 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20    Regardless of 
29010 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20  pTemp, allocate 
29020 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69  a new entry.** i
29030 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d  n pPage->aOvfl[]
29040 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
29050 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
29060 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
29070 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
29080 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
29090 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
290a0 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
290b0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
290c0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
290d0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
290e0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
290f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
29100 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
29110 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f  * If nSkip is no
29120 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20  n-zero, then do 
29130 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72  not copy the fir
29140 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f  st nSkip bytes o
29150 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54  f the.** cell. T
29160 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f  he caller will o
29170 76 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66  verwrite them af
29180 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
29190 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a  n returns. If.**
291a0 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   nSkip is non-ze
291b0 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d  ro, then pCell m
291c0 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  ay not point to 
291d0 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72  an invalid memor
291e0 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28  y location .** (
291f0 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20  but pCell+nSkip 
29200 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29  is always valid)
29210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29220 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
29230 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
29240 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
29250 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
29260 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
29270 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
29280 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
29290 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
292a0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
292b0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
292c0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
292d0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
292e0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
292f0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
29300 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
29310 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
29320 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
29330 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
29340 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
29350 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 20  /.  Pgno iChild 
29360 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
29370 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
29380 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
29390 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 29   this value */.)
293a0 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  {.  int idx;    
293b0 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
293c0 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c  o write new cell
293d0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61   content in data
293e0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  [] */.  int j;  
293f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
29400 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
29410 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20  nt top;         
29420 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
29430 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e  f content for an
29440 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d  y cell in data[]
29450 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20   */.  int end;  
29460 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29470 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 6c   byte past the l
29480 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  ast cell pointer
29490 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
294a0 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20  int ins;        
294b0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61    /* Index in da
294c0 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63  ta[] where new c
294d0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69  ell pointer is i
294e0 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74  nserted */.  int
294f0 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
29500 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61  * Offset into da
29510 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65  ta[] of the page
29520 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
29530 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f   cellOffset;   /
29540 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69 72  * Address of fir
29550 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  st cell pointer 
29560 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75  in data[] */.  u
29570 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
29580 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20   /* The content 
29590 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67  of the whole pag
295a0 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  e */.  u8 *ptr; 
295b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
295c0 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f   for moving info
295d0 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69  rmation around i
295e0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 69  n data[] */..  i
295f0 6e 74 20 6e 53 6b 69 70 20 3d 20 28 69 43 68 69  nt nSkip = (iChi
29600 6c 64 20 3f 20 34 20 3a 20 30 29 3b 0a 0a 20 20  ld ? 4 : 0);..  
29610 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
29620 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
29630 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
29640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29650 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
29660 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
29670 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
29680 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a  ->pBt)<=5460 );.
29690 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
296a0 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
296b0 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
296c0 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
296d0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
296e0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29  (pPage, pCell) )
296f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29700 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29710 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
29720 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
29730 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
29740 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
29750 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
29760 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
29770 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
29780 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
29790 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
297a0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
297b0 7d 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64  }.    if( iChild
297c0 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79   ){.      put4by
297d0 74 65 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64  te(pCell, iChild
297e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  );.    }.    j =
297f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
29800 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
29810 20 6a 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   j<(int)(sizeof(
29820 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69  pPage->aOvfl)/si
29830 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66  zeof(pPage->aOvf
29840 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
29850 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
29860 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
29870 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
29880 2e 69 64 78 20 3d 20 28 75 31 36 29 69 3b 0a 20  .idx = (u16)i;. 
29890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
298a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
298b0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
298c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
298d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
298e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
298f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29900 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
29910 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
29920 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
29930 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d     data = pPage-
29940 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20  >aData;.    hdr 
29950 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
29960 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65  et;.    top = ge
29970 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
29980 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66  +5]);.    cellOf
29990 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
299a0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e  llOffset;.    en
299b0 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  d = cellOffset +
299c0 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   2*pPage->nCell 
299d0 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63  + 2;.    ins = c
299e0 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b  ellOffset + 2*i;
299f0 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74  .    if( end > t
29a00 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20  op - sz ){.     
29a10 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
29a20 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
29a30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29a40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29a50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
29a60 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67   }.      top = g
29a70 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
29a80 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
29a90 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
29aa0 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
29ab0 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
29ac0 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
29ad0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
29ae0 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
29af0 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
29b00 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
29b10 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b   );.    if (idx+
29b20 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
29b30 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20  >usableSize) {. 
29b40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
29b50 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29b60 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
29b70 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
29b80 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50  Page->nFree = pP
29b90 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 75 31  age->nFree - (u1
29ba0 36 29 28 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20  6)(2 + sz);.    
29bb0 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78  memcpy(&data[idx
29bc0 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e  +nSkip], pCell+n
29bd0 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
29be0 0a 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20  .    if( iChild 
29bf0 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  ){.      put4byt
29c00 65 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 69 43  e(&data[idx], iC
29c10 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  hild);.    }.   
29c20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74   for(j=end-2, pt
29c30 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e  r=&data[j]; j>in
29c40 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29  s; j-=2, ptr-=2)
29c50 7b 0a 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d  {.      ptr[0] =
29c60 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20   ptr[-2];.      
29c70 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d  ptr[1] = ptr[-1]
29c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32  ;.    }.    put2
29c90 62 79 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c  byte(&data[ins],
29ca0 20 69 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62   idx);.    put2b
29cb0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
29cc0 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
29cd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29ce0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29cf0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
29d00 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
29d10 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
29d20 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
29d30 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
29d40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
29d50 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
29d60 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
29d70 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
29d80 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
29d90 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
29da0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
29db0 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
29dc0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b  r(pPage, pCell);
29dd0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
29de0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
29df0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
29e00 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65  Add a list of ce
29e10 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20  lls to a page.  
29e20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20  The page should 
29e30 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70  be initially emp
29e40 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73  ty..** The cells
29e50 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64 20   are guaranteed 
29e60 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  to fit on the pa
29e70 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
29e80 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  id assemblePage(
29e90 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
29ea0 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e,   /* The page
29eb0 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65   to be assemblie
29ec0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  d */.  int nCell
29ed0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
29ee0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
29ef0 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20 70  to add to this p
29f00 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
29f10 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f  Cell,      /* Po
29f20 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62  inters to cell b
29f30 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a  odies */.  u16 *
29f40 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20  aSize        /* 
29f50 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c  Sizes of the cel
29f60 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ls */.){.  int i
29f70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
29f80 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
29f90 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72 3b 20    u8 *pCellptr; 
29fa0 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
29fb0 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e  f next cell poin
29fc0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c  ter */.  int cel
29fd0 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64  lbody;     /* Ad
29fe0 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65  dress of next ce
29ff0 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20  ll body */.  u8 
2a000 2a 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70  * const data = p
2a010 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20  Page->aData;    
2a020 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2a030 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20  ter to data for 
2a040 70 50 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  pPage */.  const
2a050 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
2a060 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
2a070 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2a080 20 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50   of header on pP
2a090 61 67 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69  age */.  const i
2a0a0 6e 74 20 6e 55 73 61 62 6c 65 20 3d 20 70 50 61  nt nUsable = pPa
2a0b0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2a0c0 69 7a 65 3b 20 2f 2a 20 55 73 61 62 6c 65 20 73  ize; /* Usable s
2a0d0 69 7a 65 20 6f 66 20 70 61 67 65 20 2a 2f 0a 0a  ize of page */..
2a0e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2a0f0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2a100 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2a110 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
2a120 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
2a130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
2a140 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
2a150 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
2a160 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
2a170 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
2a180 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2a190 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2a1a0 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
2a1b0 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
2a1c0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70  Check that the p
2a1d0 61 67 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  age has just bee
2a1e0 6e 20 7a 65 72 6f 65 64 20 62 79 20 7a 65 72 6f  n zeroed by zero
2a1f0 50 61 67 65 28 29 20 2a 2f 0a 20 20 61 73 73 65  Page() */.  asse
2a200 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2a210 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a220 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
2a230 68 64 72 2b 35 5d 29 3d 3d 6e 55 73 61 62 6c 65  hdr+5])==nUsable
2a240 20 29 3b 0a 0a 20 20 70 43 65 6c 6c 70 74 72 20   );..  pCellptr 
2a250 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
2a260 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
2a270 6c 2a 32 5d 3b 0a 20 20 63 65 6c 6c 62 6f 64 79  l*2];.  cellbody
2a280 20 3d 20 6e 55 73 61 62 6c 65 3b 0a 20 20 66 6f   = nUsable;.  fo
2a290 72 28 69 3d 6e 43 65 6c 6c 2d 31 3b 20 69 3e 3d  r(i=nCell-1; i>=
2a2a0 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 43 65  0; i--){.    pCe
2a2b0 6c 6c 70 74 72 20 2d 3d 20 32 3b 0a 20 20 20 20  llptr -= 2;.    
2a2c0 63 65 6c 6c 62 6f 64 79 20 2d 3d 20 61 53 69 7a  cellbody -= aSiz
2a2d0 65 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79  e[i];.    put2by
2a2e0 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 63 65 6c  te(pCellptr, cel
2a2f0 6c 62 6f 64 79 29 3b 0a 20 20 20 20 6d 65 6d 63  lbody);.    memc
2a300 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
2a310 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
2a320 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  Size[i]);.  }.  
2a330 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
2a340 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
2a350 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
2a360 68 64 72 2b 35 5d 2c 20 63 65 6c 6c 62 6f 64 79  hdr+5], cellbody
2a370 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
2a380 65 20 2d 3d 20 28 6e 43 65 6c 6c 2a 32 20 2b 20  e -= (nCell*2 + 
2a390 6e 55 73 61 62 6c 65 20 2d 20 63 65 6c 6c 62 6f  nUsable - cellbo
2a3a0 64 79 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43  dy);.  pPage->nC
2a3b0 65 6c 6c 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c  ell = (u16)nCell
2a3c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2a3d0 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74  ollowing paramet
2a3e0 65 72 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f  ers determine ho
2a3f0 77 20 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20  w many adjacent 
2a400 70 61 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76  pages get involv
2a410 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e  ed.** in a balan
2a420 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20  cing operation. 
2a430 20 4e 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65   NN is the numbe
2a440 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f  r of neighbors o
2a450 6e 20 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a  n either side.**
2a460 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 68 61   of the page tha
2a470 74 20 70 61 72 74 69 63 69 70 61 74 65 20 69 6e  t participate in
2a480 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f   the balancing o
2a490 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73  peration.  NB is
2a4a0 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75   the.** total nu
2a4b0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
2a4c0 61 74 20 70 61 72 74 69 63 69 70 61 74 65 2c 20  at participate, 
2a4d0 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61  including the ta
2a4e0 72 67 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a  rget page and.**
2a4f0 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e   NN neighbors on
2a500 20 65 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a   either side..**
2a510 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  .** The minimum 
2a520 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31  value of NN is 1
2a530 20 28 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49   (of course).  I
2a540 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f  ncreasing NN abo
2a550 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72  ve 1.** (to 2 or
2a560 20 33 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65   3) gives a mode
2a570 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69  st improvement i
2a580 6e 20 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c  n SELECT and DEL
2a590 45 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a  ETE performance.
2a5a0 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66  ** in exchange f
2a5b0 6f 72 20 61 20 6c 61 72 67 65 72 20 64 65 67 72  or a larger degr
2a5c0 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52  adation in INSER
2a5d0 54 20 61 6e 64 20 55 50 44 41 54 45 20 70 65 72  T and UPDATE per
2a5e0 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65  formance..** The
2a5f0 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70   value of NN app
2a600 65 61 72 73 20 74 6f 20 67 69 76 65 20 74 68 65  ears to give the
2a610 20 62 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76   best results ov
2a620 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e  erall..*/.#defin
2a630 65 20 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20  e NN 1          
2a640 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a650 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
2a660 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
2a670 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20  e */.#define NB 
2a680 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a  (NN*2+1)      /*
2a690 20 54 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76   Total pages inv
2a6a0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c  olved in the bal
2a6b0 61 6e 63 65 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65  ance */...#ifnde
2a6c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  f SQLITE_OMIT_QU
2a6d0 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a  ICKBALANCE./*.**
2a6e0 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   This version of
2a6f0 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c   balance() handl
2a700 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70  es the common sp
2a710 65 63 69 61 6c 20 63 61 73 65 20 77 68 65 72 65  ecial case where
2a720 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20  .** a new entry 
2a730 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  is being inserte
2a740 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65  d on the extreme
2a750 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68   right-end of th
2a760 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74  e.** tree, in ot
2a770 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20  her words, when 
2a780 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69  the new entry wi
2a790 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61  ll become the la
2a7a0 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69  rgest.** entry i
2a7b0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a  n the tree..**.*
2a7c0 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79  * Instead of try
2a7d0 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20  ing balance the 
2a7e0 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  3 right-most lea
2a7f0 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64  f pages, just ad
2a800 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20  d.** a new page 
2a810 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  to the right-han
2a820 64 20 73 69 64 65 20 61 6e 64 20 70 75 74 20 74  d side and put t
2a830 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79  he one new entry
2a840 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65   in.** that page
2a850 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73 20 74  .  This leaves t
2a860 68 65 20 72 69 67 68 74 20 73 69 64 65 20 6f 66  he right side of
2a870 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68   the tree somewh
2a880 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64  at.** unbalanced
2a890 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72 65 20  .  But odds are 
2a8a0 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
2a8b0 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e  inserting new en
2a8c0 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20  tries.** at the 
2a8d0 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61  end soon afterwa
2a8e0 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c  rds so the nearl
2a8f0 79 20 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c  y empty page wil
2a900 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c  l quickly.** fil
2a910 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67  l up.  On averag
2a920 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69  e..**.** pPage i
2a930 73 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  s the leaf page 
2a940 77 68 69 63 68 20 69 73 20 74 68 65 20 72 69 67  which is the rig
2a950 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20  ht-most page in 
2a960 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61  the tree..** pPa
2a970 72 65 6e 74 20 69 73 20 69 74 73 20 70 61 72 65  rent is its pare
2a980 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20  nt.  pPage must 
2a990 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76  have a single ov
2a9a0 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20  erflow entry.** 
2a9b0 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68  which is also th
2a9c0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2a9d0 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a  ry on the page..
2a9e0 2a 2a 0a 2a 2a 20 54 68 65 20 70 53 70 61 63 65  **.** The pSpace
2a9f0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
2aa00 74 6f 20 73 74 6f 72 65 20 61 20 74 65 6d 70 6f  to store a tempo
2aa10 72 61 72 79 20 63 6f 70 79 20 6f 66 20 74 68 65  rary copy of the
2aa20 20 64 69 76 69 64 65 72 0a 2a 2a 20 63 65 6c 6c   divider.** cell
2aa30 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 69 6e   that will be in
2aa40 73 65 72 74 65 64 20 69 6e 74 6f 20 70 50 61 72  serted into pPar
2aa50 65 6e 74 2e 20 53 75 63 68 20 61 20 63 65 6c 6c  ent. Such a cell
2aa60 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 34   consists of a 4
2aa70 0a 2a 2a 20 62 79 74 65 20 70 61 67 65 20 6e 75  .** byte page nu
2aa80 6d 62 65 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79  mber followed by
2aa90 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
2aaa0 74 68 20 69 6e 74 65 67 65 72 2e 20 49 6e 20 6f  th integer. In o
2aab0 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
2aac0 74 20 6d 6f 73 74 20 31 33 20 62 79 74 65 73 2e  t most 13 bytes.
2aad0 20 48 65 6e 63 65 20 74 68 65 20 70 53 70 61 63   Hence the pSpac
2aae0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
2aaf0 20 61 74 0a 2a 2a 20 6c 65 61 73 74 20 31 33 20   at.** least 13 
2ab00 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
2ab10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
2ab20 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61  ance_quick(MemPa
2ab30 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 4d 65 6d  ge *pParent, Mem
2ab40 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
2ab50 2a 70 53 70 61 63 65 29 7b 0a 20 20 42 74 53 68  *pSpace){.  BtSh
2ab60 61 72 65 64 20 2a 63 6f 6e 73 74 20 70 42 74 20  ared *const pBt 
2ab70 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 20 20 20  = pPage->pBt;   
2ab80 20 2f 2a 20 42 2d 54 72 65 65 20 44 61 74 61 62   /* B-Tree Datab
2ab90 61 73 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ase */.  MemPage
2aba0 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
2abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2abc0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
2abd0 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
2abe0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac00 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
2ac10 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77  /.  Pgno pgnoNew
2ac20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac30 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
2ac40 20 6e 75 6d 62 65 72 20 6f 66 20 70 4e 65 77 20   number of pNew 
2ac50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
2ac60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2ac70 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2ac80 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2ac90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2aca0 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74  riteable(pParent
2acb0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2acc0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
2acd0 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 0a  Overflow==1 );..
2ace0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
2acf0 6c 6c 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll<=0 ) return S
2ad00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2ad10 50 54 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61  PT;..  /* Alloca
2ad20 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e 20 54  te a new page. T
2ad30 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
2ad40 63 6f 6d 65 20 74 68 65 20 72 69 67 68 74 2d 73  come the right-s
2ad50 69 62 6c 69 6e 67 20 6f 66 20 0a 20 20 2a 2a 20  ibling of .  ** 
2ad60 70 50 61 67 65 2e 20 4d 61 6b 65 20 74 68 65 20  pPage. Make the 
2ad70 70 61 72 65 6e 74 20 70 61 67 65 20 77 72 69 74  parent page writ
2ad80 61 62 6c 65 2c 20 73 6f 20 74 68 61 74 20 74 68  able, so that th
2ad90 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65  e new divider ce
2ada0 6c 6c 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69  ll.  ** may be i
2adb0 6e 73 65 72 74 65 64 2e 20 49 66 20 62 6f 74 68  nserted. If both
2adc0 20 74 68 65 73 65 20 6f 70 65 72 61 74 69 6f 6e   these operation
2add0 73 20 61 72 65 20 73 75 63 63 65 73 73 66 75 6c  s are successful
2ade0 2c 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  , proceed..  */.
2adf0 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2ae00 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2ae10 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30  New, &pgnoNew, 0
2ae20 2c 20 30 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  , 0);..  if( rc=
2ae30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 0a 20  =SQLITE_OK ){.. 
2ae40 20 20 20 75 38 20 2a 70 4f 75 74 20 3d 20 26 70     u8 *pOut = &p
2ae50 53 70 61 63 65 5b 34 5d 3b 0a 20 20 20 20 75 38  Space[4];.    u8
2ae60 20 2a 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d   *pCell = pPage-
2ae70 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b  >aOvfl[0].pCell;
2ae80 0a 20 20 20 20 75 31 36 20 73 7a 43 65 6c 6c 20  .    u16 szCell 
2ae90 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
2aea0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
2aeb0 20 75 38 20 2a 70 53 74 6f 70 3b 0a 0a 20 20 20   u8 *pStop;..   
2aec0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2aed0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2aee0 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20  (pNew->pDbPage) 
2aef0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2af00 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3d 3d  Page->aData[0]==
2af10 28 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  (PTF_INTKEY|PTF_
2af20 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 4c 45 41  LEAFDATA|PTF_LEA
2af30 46 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  F) );.    zeroPa
2af40 67 65 28 70 4e 65 77 2c 20 50 54 46 5f 49 4e 54  ge(pNew, PTF_INT
2af50 4b 45 59 7c 50 54 46 5f 4c 45 41 46 44 41 54 41  KEY|PTF_LEAFDATA
2af60 7c 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20  |PTF_LEAF);.    
2af70 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65  assemblePage(pNe
2af80 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73  w, 1, &pCell, &s
2af90 7a 43 65 6c 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  zCell);..    /* 
2afa0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
2afb0 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
2afc0 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
2afd0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a  ointer map.    *
2afe0 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66  * with entries f
2aff0 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c  or the new page,
2b000 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72   and any pointer
2b010 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a   from the .    *
2b020 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61  * cell on the pa
2b030 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ge to an overflo
2b040 77 20 70 61 67 65 2e 20 49 66 20 65 69 74 68 65  w page. If eithe
2b050 72 20 6f 66 20 74 68 65 73 65 0a 20 20 20 20 2a  r of these.    *
2b060 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 66 61 69  * operations fai
2b070 6c 73 2c 20 74 68 65 20 72 65 74 75 72 6e 20 63  ls, the return c
2b080 6f 64 65 20 69 73 20 73 65 74 2c 20 62 75 74 20  ode is set, but 
2b090 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
2b0a0 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 72 65 6e   ** of the paren
2b0b0 74 20 70 61 67 65 20 61 72 65 20 73 74 69 6c 6c  t page are still
2b0c0 20 6d 61 6e 69 70 75 6c 61 74 65 64 20 62 79 20   manipulated by 
2b0d0 74 68 68 20 63 6f 64 65 20 62 65 6c 6f 77 2e 0a  thh code below..
2b0e0 20 20 20 20 2a 2a 20 54 68 61 74 20 69 73 20 4f      ** That is O
2b0f0 6b 2c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  k, at this point
2b100 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
2b110 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2b120 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b  o.    ** be mark
2b130 65 64 20 61 73 20 64 69 72 74 79 2e 20 52 65 74  ed as dirty. Ret
2b140 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
2b150 63 6f 64 65 20 77 69 6c 6c 20 63 61 75 73 65 20  code will cause 
2b160 61 0a 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63  a.    ** rollbac
2b170 6b 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 63  k, undoing any c
2b180 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
2b190 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2b1a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
2b1b0 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2b1c0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2b1d0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77  Put(pBt, pgnoNew
2b1e0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
2b1f0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a  pParent->pgno);.
2b200 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
2b210 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  >pNew->minLocal 
2b220 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2b230 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2b240 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
2b250 72 28 70 4e 65 77 2c 20 70 43 65 6c 6c 29 3b 0a  r(pNew, pCell);.
2b260 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b270 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61  .    /* Create a
2b280 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 74 6f   divider cell to
2b290 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 70 50 61   insert into pPa
2b2a0 72 65 6e 74 2e 20 54 68 65 20 64 69 76 69 64 65  rent. The divide
2b2b0 72 20 63 65 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  r cell.    ** co
2b2c0 6e 73 69 73 74 73 20 6f 66 20 61 20 34 2d 62 79  nsists of a 4-by
2b2d0 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  te page number (
2b2e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2b2f0 6f 66 20 70 50 61 67 65 29 20 61 6e 64 0a 20 20  of pPage) and.  
2b300 20 20 2a 2a 20 61 20 76 61 72 69 61 62 6c 65 20    ** a variable 
2b310 6c 65 6e 67 74 68 20 6b 65 79 20 76 61 6c 75 65  length key value
2b320 20 28 77 68 69 63 68 20 6d 75 73 74 20 62 65 20   (which must be 
2b330 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20 61  the same value a
2b340 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 61 72  s the.    ** lar
2b350 67 65 73 74 20 6b 65 79 20 6f 6e 20 70 50 61 67  gest key on pPag
2b360 65 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e)..    **.    *
2b370 2a 20 54 6f 20 66 69 6e 64 20 74 68 65 20 6c 61  * To find the la
2b380 72 67 65 73 74 20 6b 65 79 20 76 61 6c 75 65 20  rgest key value 
2b390 6f 6e 20 70 50 61 67 65 2c 20 66 69 72 73 74 20  on pPage, first 
2b3a0 66 69 6e 64 20 74 68 65 20 72 69 67 68 74 2d 6d  find the right-m
2b3b0 6f 73 74 20 0a 20 20 20 20 2a 2a 20 63 65 6c 6c  ost .    ** cell
2b3c0 20 6f 6e 20 70 50 61 67 65 2e 20 54 68 65 20 66   on pPage. The f
2b3d0 69 72 73 74 20 74 77 6f 20 66 69 65 6c 64 73 20  irst two fields 
2b3e0 6f 66 20 74 68 69 73 20 63 65 6c 6c 20 61 72 65  of this cell are
2b3f0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 65 63   the .    ** rec
2b400 6f 72 64 2d 6c 65 6e 67 74 68 20 28 61 20 76 61  ord-length (a va
2b410 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e  riable length in
2b420 74 65 67 65 72 20 61 74 20 6d 6f 73 74 20 33 32  teger at most 32
2b430 2d 62 69 74 73 20 69 6e 20 73 69 7a 65 29 0a 20  -bits in size). 
2b440 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6b 65     ** and the ke
2b450 79 20 76 61 6c 75 65 20 28 61 20 76 61 72 69 61  y value (a varia
2b460 62 6c 65 20 6c 65 6e 67 74 68 20 69 6e 74 65 67  ble length integ
2b470 65 72 2c 20 6d 61 79 20 68 61 76 65 20 61 6e 79  er, may have any
2b480 20 76 61 6c 75 65 29 2e 0a 20 20 20 20 2a 2a 20   value)..    ** 
2b490 54 68 65 20 66 69 72 73 74 20 6f 66 20 74 68 65  The first of the
2b4a0 20 77 68 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70   while(...) loop
2b4b0 73 20 62 65 6c 6f 77 20 73 6b 69 70 73 20 6f 76  s below skips ov
2b4c0 65 72 20 74 68 65 20 72 65 63 6f 72 64 2d 6c 65  er the record-le
2b4d0 6e 67 74 68 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ngth.    ** fiel
2b4e0 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 77 68  d. The second wh
2b4f0 69 6c 65 28 2e 2e 2e 29 20 6c 6f 6f 70 20 63 6f  ile(...) loop co
2b500 70 69 65 73 20 74 68 65 20 6b 65 79 20 76 61 6c  pies the key val
2b510 75 65 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ue from the.    
2b520 2a 2a 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ** cell on pPage
2b530 20 69 6e 74 6f 20 74 68 65 20 70 53 70 61 63 65   into the pSpace
2b540 20 62 75 66 66 65 72 2e 0a 20 20 20 20 2a 2f 0a   buffer..    */.
2b550 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2b560 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
2b570 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20  e->nCell-1);.   
2b580 20 70 53 74 6f 70 20 3d 20 26 70 43 65 6c 6c 5b   pStop = &pCell[
2b590 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
2b5a0 2a 28 70 43 65 6c 6c 2b 2b 29 26 30 78 38 30 29  *(pCell++)&0x80)
2b5b0 20 26 26 20 70 43 65 6c 6c 3c 70 53 74 6f 70 20   && pCell<pStop 
2b5c0 29 3b 0a 20 20 20 20 70 53 74 6f 70 20 3d 20 26  );.    pStop = &
2b5d0 70 43 65 6c 6c 5b 39 5d 3b 0a 20 20 20 20 77 68  pCell[9];.    wh
2b5e0 69 6c 65 28 20 28 28 2a 28 70 4f 75 74 2b 2b 29  ile( ((*(pOut++)
2b5f0 20 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 29 26 30   = *(pCell++))&0
2b600 78 38 30 29 20 26 26 20 70 43 65 6c 6c 3c 70 53  x80) && pCell<pS
2b610 74 6f 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  top );..    /* I
2b620 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 69  nsert the new di
2b630 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20  vider cell into 
2b640 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20  pParent. */.    
2b650 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65  insertCell(pPare
2b660 6e 74 2c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  nt,pParent->nCel
2b670 6c 2c 70 53 70 61 63 65 2c 28 69 6e 74 29 28 70  l,pSpace,(int)(p
2b680 4f 75 74 2d 70 53 70 61 63 65 29 2c 30 2c 70 50  Out-pSpace),0,pP
2b690 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  age->pgno);..   
2b6a0 20 2f 2a 20 53 65 74 20 74 68 65 20 72 69 67 68   /* Set the righ
2b6b0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
2b6c0 6f 66 20 70 50 61 72 65 6e 74 20 74 6f 20 70 6f  of pParent to po
2b6d0 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 70  int to the new p
2b6e0 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 75 74 34  age. */.    put4
2b6f0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2b700 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2b710 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f  rOffset+8], pgno
2b720 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  New);.  .    /* 
2b730 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
2b740 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
2b750 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
2b760 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
2b770 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
2b780 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
2b790 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
2b7a0 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  BALANCE */..#if 
2b7b0 30 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  0./*.** This fun
2b7c0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
2b7d0 6f 6e 74 72 69 62 75 74 65 20 61 6e 79 74 68 69  ontribute anythi
2b7e0 6e 67 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ng to the operat
2b7f0 69 6f 6e 20 6f 66 20 53 51 4c 69 74 65 2e 0a 2a  ion of SQLite..*
2b800 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 69 6d 65  * it is sometime
2b810 73 20 61 63 74 69 76 61 74 65 64 20 74 65 6d 70  s activated temp
2b820 6f 72 61 72 69 6c 79 20 77 68 69 6c 65 20 64 65  orarily while de
2b830 62 75 67 67 69 6e 67 20 63 6f 64 65 20 72 65 73  bugging code res
2b840 70 6f 6e 73 69 62 6c 65 20 0a 2a 2a 20 66 6f 72  ponsible .** for
2b850 20 73 65 74 74 69 6e 67 20 70 6f 69 6e 74 65 72   setting pointer
2b860 2d 6d 61 70 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  -map entries..*/
2b870 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
2b880 61 70 43 68 65 63 6b 50 61 67 65 73 28 4d 65 6d  apCheckPages(Mem
2b890 50 61 67 65 20 2a 2a 61 70 50 61 67 65 2c 20 69  Page **apPage, i
2b8a0 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74  nt nPage){.  int
2b8b0 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 30   i, j;.  for(i=0
2b8c0 3b 20 69 3c 6e 50 61 67 65 3b 20 69 2b 2b 29 7b  ; i<nPage; i++){
2b8d0 0a 20 20 20 20 50 67 6e 6f 20 6e 3b 0a 20 20 20  .    Pgno n;.   
2b8e0 20 75 38 20 65 3b 0a 20 20 20 20 4d 65 6d 50 61   u8 e;.    MemPa
2b8f0 67 65 20 2a 70 50 61 67 65 20 3d 20 61 70 50 61  ge *pPage = apPa
2b900 67 65 5b 69 5d 3b 0a 20 20 20 20 42 74 53 68 61  ge[i];.    BtSha
2b910 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
2b920 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
2b930 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2b940 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   );..    for(j=0
2b950 3b 20 6a 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; j<pPage->nCell
2b960 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 43 65  ; j++){.      Ce
2b970 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
2b980 20 20 20 75 38 20 2a 7a 3b 0a 20 20 20 20 20 0a     u8 *z;.     .
2b990 20 20 20 20 20 20 7a 20 3d 20 66 69 6e 64 43 65        z = findCe
2b9a0 6c 6c 28 70 50 61 67 65 2c 20 6a 29 3b 0a 20 20  ll(pPage, j);.  
2b9b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b9c0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
2b9d0 67 65 2c 20 7a 2c 20 26 69 6e 66 6f 29 3b 0a 20  ge, z, &info);. 
2b9e0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
2b9f0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
2ba00 20 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67     Pgno ovfl = g
2ba10 65 74 34 62 79 74 65 28 26 7a 5b 69 6e 66 6f 2e  et4byte(&z[info.
2ba20 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20  iOverflow]);.   
2ba30 20 20 20 20 20 70 74 72 6d 61 70 47 65 74 28 70       ptrmapGet(p
2ba40 42 74 2c 20 6f 76 66 6c 2c 20 26 65 2c 20 26 6e  Bt, ovfl, &e, &n
2ba50 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2ba60 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70 67 6e  t( n==pPage->pgn
2ba70 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50 5f 4f  o && e==PTRMAP_O
2ba80 56 45 52 46 4c 4f 57 31 20 29 3b 0a 20 20 20 20  VERFLOW1 );.    
2ba90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70    }.      if( !p
2baa0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2bab0 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
2bac0 20 3d 20 67 65 74 34 62 79 74 65 28 7a 29 3b 0a   = get4byte(z);.
2bad0 20 20 20 20 20 20 20 20 70 74 72 6d 61 70 47 65          ptrmapGe
2bae0 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
2baf0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 61  , &n);.        a
2bb00 73 73 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d  ssert( n==pPage-
2bb10 3e 70 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d  >pgno && e==PTRM
2bb20 41 50 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20  AP_BTREE );.    
2bb30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2bb40 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2bb50 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
2bb60 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ld = get4byte(&p
2bb70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2bb80 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2bb90 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 47 65  ;.      ptrmapGe
2bba0 74 28 70 42 74 2c 20 63 68 69 6c 64 2c 20 26 65  t(pBt, child, &e
2bbb0 2c 20 26 6e 29 3b 0a 20 20 20 20 20 20 61 73 73  , &n);.      ass
2bbc0 65 72 74 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 70  ert( n==pPage->p
2bbd0 67 6e 6f 20 26 26 20 65 3d 3d 50 54 52 4d 41 50  gno && e==PTRMAP
2bbe0 5f 42 54 52 45 45 20 29 3b 0a 20 20 20 20 7d 0a  _BTREE );.    }.
2bbf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
2bc00 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2bc10 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2bc20 20 75 73 65 64 20 74 6f 20 63 6f 70 79 20 74 68   used to copy th
2bc30 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2bc40 65 20 62 2d 74 72 65 65 20 6e 6f 64 65 20 73 74  e b-tree node st
2bc50 6f 72 65 64 20 0a 2a 2a 20 6f 6e 20 70 61 67 65  ored .** on page
2bc60 20 70 46 72 6f 6d 20 74 6f 20 70 61 67 65 20 70   pFrom to page p
2bc70 54 6f 2e 20 49 66 20 70 61 67 65 20 70 46 72 6f  To. If page pFro
2bc80 6d 20 77 61 73 20 6e 6f 74 20 61 20 6c 65 61 66  m was not a leaf
2bc90 20 70 61 67 65 2c 20 74 68 65 6e 0a 2a 2a 20 74   page, then.** t
2bca0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
2bcb0 6e 74 72 69 65 73 20 66 6f 72 20 65 61 63 68 20  ntries for each 
2bcc0 63 68 69 6c 64 20 70 61 67 65 20 61 72 65 20 75  child page are u
2bcd0 70 64 61 74 65 64 20 73 6f 20 74 68 61 74 20 74  pdated so that t
2bce0 68 65 0a 2a 2a 20 70 61 72 65 6e 74 20 70 61 67  he.** parent pag
2bcf0 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
2bd00 70 6f 69 6e 74 65 72 20 6d 61 70 20 69 73 20 70  pointer map is p
2bd10 61 67 65 20 70 54 6f 2e 20 49 66 20 70 46 72 6f  age pTo. If pFro
2bd20 6d 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a 20 61  m contained.** a
2bd30 6e 79 20 63 65 6c 6c 73 20 77 69 74 68 20 6f 76  ny cells with ov
2bd40 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
2bd50 74 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ters, then the c
2bd60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 6f 69  orresponding poi
2bd70 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
2bd80 69 65 73 20 61 72 65 20 61 6c 73 6f 20 75 70 64  ies are also upd
2bd90 61 74 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  ated so that the
2bda0 20 70 61 72 65 6e 74 20 70 61 67 65 20 69 73 20   parent page is 
2bdb0 70 61 67 65 20 70 54 6f 2e 0a 2a 2a 0a 2a 2a 20  page pTo..**.** 
2bdc0 49 66 20 70 46 72 6f 6d 20 69 73 20 63 75 72 72  If pFrom is curr
2bdd0 65 6e 74 6c 79 20 63 61 72 72 79 69 6e 67 20 61  ently carrying a
2bde0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  ny overflow cell
2bdf0 73 20 28 65 6e 74 72 69 65 73 20 69 6e 20 74 68  s (entries in th
2be00 65 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 4f 76  e.** MemPage.aOv
2be10 66 6c 5b 5d 20 61 72 72 61 79 29 2c 20 74 68 65  fl[] array), the
2be20 79 20 61 72 65 20 6e 6f 74 20 63 6f 70 69 65 64  y are not copied
2be30 20 74 6f 20 70 54 6f 2e 20 0a 2a 2a 0a 2a 2a 20   to pTo. .**.** 
2be40 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
2be50 2c 20 70 61 67 65 20 70 54 6f 20 69 73 20 72 65  , page pTo is re
2be60 69 6e 69 74 69 61 6c 69 7a 65 64 20 75 73 69 6e  initialized usin
2be70 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  g sqlite3BtreeIn
2be80 69 74 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  itPage()..**.** 
2be90 54 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  The performance 
2bea0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2beb0 20 69 73 20 6e 6f 74 20 63 72 69 74 69 63 61 6c   is not critical
2bec0 2e 20 49 74 20 69 73 20 6f 6e 6c 79 20 75 73 65  . It is only use
2bed0 64 20 62 79 20 0a 2a 2a 20 74 68 65 20 62 61 6c  d by .** the bal
2bee0 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 29  ance_shallower()
2bef0 20 61 6e 64 20 62 61 6c 61 6e 63 65 5f 64 65 65   and balance_dee
2bf00 70 65 72 28 29 20 70 72 6f 63 65 64 75 72 65 73  per() procedures
2bf10 2c 20 6e 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20  , neither of.** 
2bf20 77 68 69 63 68 20 61 72 65 20 63 61 6c 6c 65 64  which are called
2bf30 20 6f 66 74 65 6e 20 75 6e 64 65 72 20 6e 6f 72   often under nor
2bf40 6d 61 6c 20 63 69 72 63 75 6d 73 74 61 6e 63 65  mal circumstance
2bf50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
2bf60 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
2bf70 28 4d 65 6d 50 61 67 65 20 2a 70 46 72 6f 6d 2c  (MemPage *pFrom,
2bf80 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 29 7b 0a   MemPage *pTo){.
2bf90 20 20 42 74 53 68 61 72 65 64 20 2a 20 63 6f 6e    BtShared * con
2bfa0 73 74 20 70 42 74 20 3d 20 70 46 72 6f 6d 2d 3e  st pBt = pFrom->
2bfb0 70 42 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  pBt;.  u8 * cons
2bfc0 74 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d  t aFrom = pFrom-
2bfd0 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63  >aData;.  u8 * c
2bfe0 6f 6e 73 74 20 61 54 6f 20 3d 20 70 54 6f 2d 3e  onst aTo = pTo->
2bff0 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 63 6f 6e  aData;.  int con
2c000 73 74 20 69 46 72 6f 6d 48 64 72 20 3d 20 70 46  st iFromHdr = pF
2c010 72 6f 6d 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  rom->hdrOffset;.
2c020 20 20 69 6e 74 20 63 6f 6e 73 74 20 69 54 6f 48    int const iToH
2c030 64 72 20 3d 20 28 28 70 54 6f 2d 3e 70 67 6e 6f  dr = ((pTo->pgno
2c040 3d 3d 31 29 20 3f 20 31 30 30 20 3a 20 30 29 3b  ==1) ? 100 : 0);
2c050 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c060 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 44 61  TE_OK;.  int iDa
2c070 74 61 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ta;..  assert( p
2c080 46 72 6f 6d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  From->isInit );.
2c090 20 20 61 73 73 65 72 74 28 20 70 46 72 6f 6d 2d    assert( pFrom-
2c0a0 3e 6e 46 72 65 65 3e 3d 69 54 6f 48 64 72 20 29  >nFree>=iToHdr )
2c0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 67 65 74 32  ;.  assert( get2
2c0c0 62 79 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f  byte(&aFrom[iFro
2c0d0 6d 48 64 72 2b 35 5d 29 3c 3d 70 42 74 2d 3e 75  mHdr+5])<=pBt->u
2c0e0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 0a 20 20  sableSize );..  
2c0f0 2f 2a 20 43 6f 70 79 20 74 68 65 20 62 2d 74 72  /* Copy the b-tr
2c100 65 65 20 6e 6f 64 65 20 63 6f 6e 74 65 6e 74 20  ee node content 
2c110 66 72 6f 6d 20 70 61 67 65 20 70 46 72 6f 6d 20  from page pFrom 
2c120 74 6f 20 70 61 67 65 20 70 54 6f 2e 20 2a 2f 0a  to page pTo. */.
2c130 20 20 69 44 61 74 61 20 3d 20 67 65 74 32 62 79    iData = get2by
2c140 74 65 28 26 61 46 72 6f 6d 5b 69 46 72 6f 6d 48  te(&aFrom[iFromH
2c150 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
2c160 28 26 61 54 6f 5b 69 44 61 74 61 5d 2c 20 26 61  (&aTo[iData], &a
2c170 46 72 6f 6d 5b 69 44 61 74 61 5d 2c 20 70 42 74  From[iData], pBt
2c180 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 69 44 61  ->usableSize-iDa
2c190 74 61 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 61  ta);.  memcpy(&a
2c1a0 54 6f 5b 69 54 6f 48 64 72 5d 2c 20 26 61 46 72  To[iToHdr], &aFr
2c1b0 6f 6d 5b 69 46 72 6f 6d 48 64 72 5d 2c 20 70 46  om[iFromHdr], pF
2c1c0 72 6f 6d 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  rom->cellOffset 
2c1d0 2b 20 32 2a 70 46 72 6f 6d 2d 3e 6e 43 65 6c 6c  + 2*pFrom->nCell
2c1e0 29 3b 0a 0a 20 20 2f 2a 20 52 65 69 6e 69 74 69  );..  /* Reiniti
2c1f0 61 6c 69 7a 65 20 70 61 67 65 20 70 54 6f 20 73  alize page pTo s
2c200 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  o that the conte
2c210 6e 74 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  nts of the MemPa
2c220 67 65 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  ge structure.  *
2c230 2a 20 6d 61 74 63 68 20 74 68 65 20 6e 65 77 20  * match the new 
2c240 64 61 74 61 2e 20 54 68 65 20 69 6e 69 74 69 61  data. The initia
2c250 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 70 54 6f 20  lization of pTo 
2c260 22 63 61 6e 6e 6f 74 22 20 66 61 69 6c 2c 20 61  "cannot" fail, a
2c270 73 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 20  s the.  ** data 
2c280 63 6f 70 69 65 64 20 66 72 6f 6d 20 70 46 72 6f  copied from pFro
2c290 6d 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65  m is known to be
2c2a0 20 76 61 6c 69 64 2e 20 20 2a 2f 0a 20 20 70 54   valid.  */.  pT
2c2b0 6f 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  o->isInit = 0;. 
2c2c0 20 54 45 53 54 4f 4e 4c 59 28 72 63 20 3d 20 29   TESTONLY(rc = )
2c2d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
2c2e0 74 50 61 67 65 28 70 54 6f 29 3b 0a 20 20 61 73  tPage(pTo);.  as
2c2f0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
2c300 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  _OK );..  /* If 
2c310 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2c320 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2c330 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
2c340 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 0a  ter-map entries.
2c350 20 20 2a 2a 20 66 6f 72 20 61 6e 79 20 62 2d 74    ** for any b-t
2c360 72 65 65 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ree or overflow 
2c370 70 61 67 65 73 20 74 68 61 74 20 70 54 6f 20 6e  pages that pTo n
2c380 6f 77 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ow contains the 
2c390 70 6f 69 6e 74 65 72 73 20 74 6f 2e 20 2a 2f 0a  pointers to. */.
2c3a0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2c3b0 55 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  UM ){.    rc = s
2c3c0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70  etChildPtrmaps(p
2c3d0 54 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  To);.  }.  retur
2c3e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2c3f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 64 69  his routine redi
2c400 73 74 72 69 62 75 74 65 73 20 63 65 6c 6c 73 20  stributes cells 
2c410 6f 6e 20 74 68 65 20 69 50 61 72 65 6e 74 49 64  on the iParentId
2c420 78 27 74 68 20 63 68 69 6c 64 20 6f 66 20 70 50  x'th child of pP
2c430 61 72 65 6e 74 0a 2a 2a 20 28 68 65 72 65 61 66  arent.** (hereaf
2c440 74 65 72 20 22 74 68 65 20 70 61 67 65 22 29 20  ter "the page") 
2c450 61 6e 64 20 75 70 20 74 6f 20 32 20 73 69 62 6c  and up to 2 sibl
2c460 69 6e 67 73 20 73 6f 20 74 68 61 74 20 61 6c 6c  ings so that all
2c470 20 70 61 67 65 73 20 68 61 76 65 20 61 62 6f 75   pages have abou
2c480 74 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 6d  t the.** same am
2c490 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61  ount of free spa
2c4a0 63 65 2e 20 55 73 75 61 6c 6c 79 20 61 20 73 69  ce. Usually a si
2c4b0 6e 67 6c 65 20 73 69 62 6c 69 6e 67 20 6f 6e 20  ngle sibling on 
2c4c0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74  either side of t
2c4d0 68 65 0a 2a 2a 20 70 61 67 65 20 61 72 65 20 75  he.** page are u
2c4e0 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
2c4f0 63 69 6e 67 2c 20 74 68 6f 75 67 68 20 62 6f 74  cing, though bot
2c500 68 20 73 69 62 6c 69 6e 67 73 20 6d 69 67 68 74  h siblings might
2c510 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e 65 0a 2a   come from one.*
2c520 2a 20 73 69 64 65 20 69 66 20 74 68 65 20 70 61  * side if the pa
2c530 67 65 20 69 73 20 74 68 65 20 66 69 72 73 74 20  ge is the first 
2c540 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
2c550 20 69 74 73 20 70 61 72 65 6e 74 2e 20 49 66 20   its parent. If 
2c560 74 68 65 20 70 61 67 65 20 0a 2a 2a 20 68 61 73  the page .** has
2c570 20 66 65 77 65 72 20 74 68 61 6e 20 32 20 73 69   fewer than 2 si
2c580 62 6c 69 6e 67 73 20 28 73 6f 6d 65 74 68 69 6e  blings (somethin
2c590 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
2c5a0 20 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 70   happen if the p
2c5b0 61 67 65 0a 2a 2a 20 69 73 20 61 20 72 6f 6f 74  age.** is a root
2c5c0 20 70 61 67 65 20 6f 72 20 61 20 63 68 69 6c 64   page or a child
2c5d0 20 6f 66 20 61 20 72 6f 6f 74 20 70 61 67 65 29   of a root page)
2c5e0 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61   then all availa
2c5f0 62 6c 65 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  ble siblings.** 
2c600 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
2c610 68 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a  he balancing..**
2c620 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
2c630 66 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 74 68  f siblings of th
2c640 65 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  e page might be 
2c650 69 6e 63 72 65 61 73 65 64 20 6f 72 20 64 65 63  increased or dec
2c660 72 65 61 73 65 64 20 62 79 20 0a 2a 2a 20 6f 6e  reased by .** on
2c670 65 20 6f 72 20 74 77 6f 20 69 6e 20 61 6e 20 65  e or two in an e
2c680 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20 70 61  ffort to keep pa
2c690 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c 20  ges nearly full 
2c6a0 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66 75 6c  but not over ful
2c6b0 6c 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  l. .**.** Note t
2c6c0 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f  hat when this ro
2c6d0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
2c6e0 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   some of the cel
2c6f0 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a  ls on the page.*
2c700 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63 74 75  * might not actu
2c710 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ally be stored i
2c720 6e 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 5b  n MemPage.aData[
2c730 5d 2e 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  ]. This can happ
2c740 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70 61 67  en.** if the pag
2c750 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e 20 54  e is overfull. T
2c760 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
2c770 72 65 73 20 74 68 61 74 20 61 6c 6c 20 63 65 6c  res that all cel
2c780 6c 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ls allocated.** 
2c790 74 6f 20 74 68 65 20 70 61 67 65 20 61 6e 64 20  to the page and 
2c7a0 69 74 73 20 73 69 62 6c 69 6e 67 73 20 66 69 74  its siblings fit
2c7b0 20 69 6e 74 6f 20 4d 65 6d 50 61 67 65 2e 61 44   into MemPage.aD
2c7c0 61 74 61 5b 5d 20 62 65 66 6f 72 65 20 72 65 74  ata[] before ret
2c7d0 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  urning..**.** In
2c7e0 20 74 68 65 20 63 6f 75 72 73 65 20 6f 66 20 62   the course of b
2c7f0 61 6c 61 6e 63 69 6e 67 20 74 68 65 20 70 61 67  alancing the pag
2c800 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e  e and its siblin
2c810 67 73 2c 20 63 65 6c 6c 73 20 6d 61 79 20 62 65  gs, cells may be
2c820 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74  .** inserted int
2c830 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
2c840 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  m the parent pag
2c850 65 20 28 70 50 61 72 65 6e 74 29 2e 20 44 6f 69  e (pParent). Doi
2c860 6e 67 20 73 6f 0a 2a 2a 20 6d 61 79 20 63 61 75  ng so.** may cau
2c870 73 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  se the parent pa
2c880 67 65 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  ge to become ove
2c890 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
2c8a0 6c 6c 2e 20 49 66 20 74 68 69 73 0a 2a 2a 20 68  ll. If this.** h
2c8b0 61 70 70 65 6e 73 2c 20 69 74 20 69 73 20 74 68  appens, it is th
2c8c0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
2c8d0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
2c8e0 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 72  o invoke the cor
2c8f0 72 65 63 74 0a 2a 2a 20 62 61 6c 61 6e 63 69 6e  rect.** balancin
2c900 67 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 69 78  g routine to fix
2c910 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 73   this problem (s
2c920 65 65 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29  ee the balance()
2c930 20 72 6f 75 74 69 6e 65 29 2e 20 0a 2a 2a 0a 2a   routine). .**.*
2c940 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
2c950 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
2c960 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
2c970 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
2c980 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
2c990 75 70 74 65 64 20 73 74 61 74 65 2e 20 53 6f 20  upted state. So 
2c9a0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2c9b0 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
2c9c0 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
2c9d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
2c9e0 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
2c9f0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
2ca00 75 6e 63 74 69 6f 6e 2c 20 61 4f 76 66 6c 53 70  unction, aOvflSp
2ca10 61 63 65 2c 20 69 73 20 61 20 70 6f 69 6e 74 65  ace, is a pointe
2ca20 72 20 74 6f 20 61 0a 2a 2a 20 62 75 66 66 65 72  r to a.** buffer
2ca30 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73   page-size bytes
2ca40 20 69 6e 20 73 69 7a 65 2e 20 49 66 2c 20 69 6e   in size. If, in
2ca50 20 69 6e 73 65 72 74 69 6e 67 20 63 65 6c 6c 73   inserting cells
2ca60 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
2ca70 0a 2a 2a 20 70 61 67 65 20 28 70 50 61 72 65 6e  .** page (pParen
2ca80 74 29 2c 20 74 68 65 20 70 61 72 65 6e 74 20 70  t), the parent p
2ca90 61 67 65 20 62 65 63 6f 6d 65 73 20 6f 76 65 72  age becomes over
2caa0 66 75 6c 6c 2c 20 74 68 69 73 20 62 75 66 66 65  full, this buffe
2cab0 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20  r is.** used to 
2cac0 73 74 6f 72 65 20 74 68 65 20 70 61 72 65 6e 74  store the parent
2cad0 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73  s overflow cells
2cae0 2e 20 42 65 63 61 75 73 65 20 74 68 69 73 20 66  . Because this f
2caf0 75 6e 63 74 69 6f 6e 20 69 6e 73 65 72 74 73 0a  unction inserts.
2cb00 2a 2a 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  ** a maximum of 
2cb10 66 6f 75 72 20 64 69 76 69 64 65 72 20 63 65 6c  four divider cel
2cb20 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ls into the pare
2cb30 6e 74 20 70 61 67 65 2c 20 61 6e 64 20 74 68 65  nt page, and the
2cb40 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 73 69 7a 65   maximum.** size
2cb50 20 6f 66 20 61 20 63 65 6c 6c 20 73 74 6f 72 65   of a cell store
2cb60 64 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 74 65  d within an inte
2cb70 72 6e 61 6c 20 6e 6f 64 65 20 69 73 20 61 6c 77  rnal node is alw
2cb80 61 79 73 20 6c 65 73 73 20 74 68 61 6e 20 31 2f  ays less than 1/
2cb90 34 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65  4.** of the page
2cba0 2d 73 69 7a 65 2c 20 74 68 65 20 61 4f 76 66 6c  -size, the aOvfl
2cbb0 53 70 61 63 65 5b 5d 20 62 75 66 66 65 72 20 69  Space[] buffer i
2cbc0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2cbd0 62 65 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f 75  be large.** enou
2cbe0 67 68 20 66 6f 72 20 61 6c 6c 20 6f 76 65 72 66  gh for all overf
2cbf0 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  low cells..**.**
2cc00 20 49 66 20 61 4f 76 66 6c 53 70 61 63 65 20 69   If aOvflSpace i
2cc10 73 20 73 65 74 20 74 6f 20 61 20 6e 75 6c 6c 20  s set to a null 
2cc20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
2cc30 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a  nction returns .
2cc40 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e  ** SQLITE_NOMEM.
2cc50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2cc60 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 0a  alance_nonroot(.
2cc70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
2cc80 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
2cc90 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2cca0 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 62 65 69   of siblings bei
2ccb0 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  ng balanced */. 
2ccc0 20 69 6e 74 20 69 50 61 72 65 6e 74 49 64 78 2c   int iParentIdx,
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cce0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 22 74 68   /* Index of "th
2ccf0 65 20 70 61 67 65 22 20 69 6e 20 70 50 61 72 65  e page" in pPare
2cd00 6e 74 20 2a 2f 0a 20 20 75 38 20 2a 61 4f 76 66  nt */.  u8 *aOvf
2cd10 6c 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  lSpace,         
2cd20 20 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 2d          /* page-
2cd30 73 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70  size bytes of sp
2cd40 61 63 65 20 66 6f 72 20 70 61 72 65 6e 74 20 6f  ace for parent o
2cd50 76 66 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52  vfl */.  int isR
2cd60 6f 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  oot             
2cd70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2cd80 20 69 66 20 70 50 61 72 65 6e 74 20 69 73 20 61   if pParent is a
2cd90 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 29 7b   root-page */.){
2cda0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2cdb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2cdc0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
2cdd0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
2cde0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
2cdf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ce00 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
2ce10 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
2ce20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
2ce30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
2ce40 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
2ce50 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
2ce60 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  rom. */.  int nN
2ce70 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
2ce80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ce90 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
2cea0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  ew[] */.  int nO
2ceb0 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2cec0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ced0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
2cee0 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  ld[] */.  int i,
2cef0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
2cf00 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2cf10 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2cf20 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20   nxDiv;         
2cf30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
2cf40 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69  t divider slot i
2cf50 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c  n pParent->aCell
2cf60 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  [] */.  int rc =
2cf70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2cf80 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75       /* The retu
2cf90 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  rn code */.  u16
2cfa0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
2cfb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69            /* 4 i
2cfc0 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
2cfd0 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a  f.  0 if not */.
2cfe0 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20    int leafData; 
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d000 2a 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20  * True if pPage 
2d010 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c  is a leaf of a L
2d020 45 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a  EAFDATA tree */.
2d030 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63    int usableSpac
2d040 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
2d050 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65  * Bytes in pPage
2d060 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64   beyond the head
2d070 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65  er */.  int page
2d080 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
2d090 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2d0a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d   pPage->aData[0]
2d0b0 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74   */.  int subtot
2d0c0 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2d0d0 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f     /* Subtotal o
2d0e0 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73  f bytes in cells
2d0f0 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a   on one page */.
2d100 20 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20    int iSpace1 = 
2d110 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2d120 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
2d130 79 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d  yte of aSpace1[]
2d140 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 76 66 6c 53   */.  int iOvflS
2d150 70 61 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  pace = 0;       
2d160 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73     /* First unus
2d170 65 64 20 62 79 74 65 20 6f 66 20 61 4f 76 66 6c  ed byte of aOvfl
2d180 53 70 61 63 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  Space[] */.  int
2d190 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20   szScratch;     
2d1a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2d1b0 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d  e of scratch mem
2d1c0 6f 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f  ory requested */
2d1d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c  .  MemPage *apOl
2d1e0 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20  d[NB];          
2d1f0 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20  /* pPage and up 
2d200 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20  to two siblings 
2d210 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
2d220 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
2d230 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
2d240 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
2d250 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
2d260 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
2d270 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
2d280 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
2d290 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
2d2a0 6e 63 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 70  ncing */.  u8 *p
2d2b0 52 69 67 68 74 3b 20 20 20 20 20 20 20 20 20 20  Right;          
2d2c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
2d2d0 69 6f 6e 20 69 6e 20 70 61 72 65 6e 74 20 6f 66  ion in parent of
2d2e0 20 72 69 67 68 74 2d 73 69 62 6c 69 6e 67 20 70   right-sibling p
2d2f0 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ointer */.  u8 *
2d300 61 70 44 69 76 5b 4e 42 2d 31 5d 3b 20 20 20 20  apDiv[NB-1];    
2d310 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
2d320 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
2d330 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
2d340 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
2d350 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2d360 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
2d370 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
2d380 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
2d390 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
2d3a0 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
2d3b0 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
2d3c0 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
2d3d0 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
2d3e0 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
2d3f0 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
2d400 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
2d410 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
2d420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d430 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
2d440 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
2d450 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
2d460 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
2d470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
2d480 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
2d490 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
2d4a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 20 2f 2a 20 54 65 6d 70 20 76 61 72 20 74     /* Temp var t
2d4d0 6f 20 73 74 6f 72 65 20 61 20 70 61 67 65 20 6e  o store a page n
2d4e0 75 6d 62 65 72 20 69 6e 20 2a 2f 0a 0a 20 20 70  umber in */..  p
2d4f0 42 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 42  Bt = pParent->pB
2d500 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2d510 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d520 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2d530 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2d540 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2d550 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
2d560 65 29 20 29 3b 0a 0a 23 69 66 20 30 0a 20 20 54  e) );..#if 0.  T
2d570 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2d580 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63 68  begin page %d ch
2d590 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50  ild of %d\n", pP
2d5a0 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72 65  age->pgno, pPare
2d5b0 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 23 65 6e 64  nt->pgno));.#end
2d5c0 69 66 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  if..  /* At this
2d5d0 20 70 6f 69 6e 74 20 70 50 61 72 65 6e 74 20 6d   point pParent m
2d5e0 61 79 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  ay have at most 
2d5f0 6f 6e 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  one overflow cel
2d600 6c 2e 20 41 6e 64 20 69 66 0a 20 20 2a 2a 20 74  l. And if.  ** t
2d610 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  his overflow cel
2d620 6c 20 69 73 20 70 72 65 73 65 6e 74 2c 20 69 74  l is present, it
2d630 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 65 6c   must be the cel
2d640 6c 20 77 69 74 68 20 0a 20 20 2a 2a 20 69 6e 64  l with .  ** ind
2d650 65 78 20 69 50 61 72 65 6e 74 49 64 78 2e 20 54  ex iParentIdx. T
2d660 68 69 73 20 73 63 65 6e 61 72 69 6f 20 63 6f 6d  his scenario com
2d670 65 73 20 61 62 6f 75 74 20 77 68 65 6e 20 74 68  es about when th
2d680 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  is function.  **
2d690 20 69 73 20 63 61 6c 6c 65 64 20 28 69 6e 64 69   is called (indi
2d6a0 72 65 63 74 6c 79 29 20 66 72 6f 6d 20 73 71 6c  rectly) from sql
2d6b0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2d6c0 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
2d6d0 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c  pParent->nOverfl
2d6e0 6f 77 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e 74  ow==0 || pParent
2d6f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29  ->nOverflow==1 )
2d700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
2d710 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  ent->nOverflow==
2d720 30 20 7c 7c 20 70 50 61 72 65 6e 74 2d 3e 61 4f  0 || pParent->aO
2d730 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d 69 50 61 72  vfl[0].idx==iPar
2d740 65 6e 74 49 64 78 20 29 3b 0a 0a 20 20 69 66 28  entIdx );..  if(
2d750 20 21 61 4f 76 66 6c 53 70 61 63 65 20 29 7b 0a   !aOvflSpace ){.
2d760 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2d770 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  E_NOMEM;.  }..  
2d780 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 69 62 6c  /* Find the sibl
2d790 69 6e 67 20 70 61 67 65 73 20 74 6f 20 62 61 6c  ing pages to bal
2d7a0 61 6e 63 65 2e 20 41 6c 73 6f 20 6c 6f 63 61 74  ance. Also locat
2d7b0 65 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70  e the cells in p
2d7c0 50 61 72 65 6e 74 20 0a 20 20 2a 2a 20 74 68 61  Parent .  ** tha
2d7d0 74 20 64 69 76 69 64 65 20 74 68 65 20 73 69 62  t divide the sib
2d7e0 6c 69 6e 67 73 2e 20 41 6e 20 61 74 74 65 6d 70  lings. An attemp
2d7f0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e  t is made to fin
2d800 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e  d NN siblings on
2d810 20 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 73 69   .  ** either si
2d820 64 65 20 6f 66 20 70 50 61 67 65 2e 20 4d 6f 72  de of pPage. Mor
2d830 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74  e siblings are t
2d840 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69  aken from one si
2d850 64 65 2c 20 68 6f 77 65 76 65 72 2c 20 0a 20 20  de, however, .  
2d860 2a 2a 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ** if there are 
2d870 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
2d880 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
2d890 68 65 72 20 73 69 64 65 2e 20 49 66 20 70 50 61  her side. If pPa
2d8a0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
2d8b0 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
2d8c0 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
2d8d0 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
2d8e0 61 72 65 20 74 61 6b 65 6e 2e 20 20 0a 20 20 2a  are taken.  .  *
2d8f0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2d900 20 61 6c 73 6f 20 64 72 6f 70 73 20 74 68 65 20   also drops the 
2d910 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
2d920 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  om the parent pa
2d930 67 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 77 61  ge. This.  ** wa
2d940 79 2c 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72  y, the remainder
2d950 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
2d960 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
2d970 6f 20 64 65 61 6c 20 77 69 74 68 20 61 6e 79 0a  o deal with any.
2d980 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 63 65    ** overflow ce
2d990 6c 6c 73 20 69 6e 20 74 68 65 20 70 61 72 65 6e  lls in the paren
2d9a0 74 20 70 61 67 65 2c 20 61 73 20 69 66 20 6f 6e  t page, as if on
2d9b0 65 20 65 78 69 73 74 65 64 20 69 74 20 68 61 73  e existed it has
2d9c0 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 62 65   already.  ** be
2d9d0 65 6e 20 72 65 6d 6f 76 65 64 2e 20 20 2a 2f 0a  en removed.  */.
2d9e0 20 20 69 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e    i = pParent->n
2d9f0 4f 76 65 72 66 6c 6f 77 20 2b 20 70 50 61 72 65  Overflow + pPare
2da00 6e 74 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 66 28  nt->nCell;.  if(
2da10 20 69 3c 32 20 29 7b 0a 20 20 20 20 6e 78 44 69   i<2 ){.    nxDi
2da20 76 20 3d 20 30 3b 0a 20 20 20 20 6e 4f 6c 64 20  v = 0;.    nOld 
2da30 3d 20 69 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = i+1;.  }else{.
2da40 20 20 20 20 6e 4f 6c 64 20 3d 20 33 3b 0a 20 20      nOld = 3;.  
2da50 20 20 69 66 28 20 69 50 61 72 65 6e 74 49 64 78    if( iParentIdx
2da60 3d 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  ==0 ){          
2da70 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 6e 78         .      nx
2da80 44 69 76 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Div = 0;.    }el
2da90 73 65 20 69 66 28 20 69 50 61 72 65 6e 74 49 64  se if( iParentId
2daa0 78 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 6e 78  x==i ){.      nx
2dab0 44 69 76 20 3d 20 69 2d 32 3b 0a 20 20 20 20 7d  Div = i-2;.    }
2dac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 78 44 69  else{.      nxDi
2dad0 76 20 3d 20 69 50 61 72 65 6e 74 49 64 78 2d 31  v = iParentIdx-1
2dae0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
2daf0 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 2b  2;.  }.  if( (i+
2db00 6e 78 44 69 76 2d 70 50 61 72 65 6e 74 2d 3e 6e  nxDiv-pParent->n
2db10 4f 76 65 72 66 6c 6f 77 29 3d 3d 70 50 61 72 65  Overflow)==pPare
2db20 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  nt->nCell ){.   
2db30 20 70 52 69 67 68 74 20 3d 20 26 70 50 61 72 65   pRight = &pPare
2db40 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
2db50 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 3b  t->hdrOffset+8];
2db60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52  .  }else{.    pR
2db70 69 67 68 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28  ight = findCell(
2db80 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
2db90 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2dba0 6c 6f 77 29 3b 0a 20 20 7d 0a 20 20 70 67 6e 6f  low);.  }.  pgno
2dbb0 20 3d 20 67 65 74 34 62 79 74 65 28 70 52 69 67   = get4byte(pRig
2dbc0 68 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 31 20  ht);.  while( 1 
2dbd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41  ){.    rc = getA
2dbe0 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2dbf0 70 67 6e 6f 2c 20 26 61 70 4f 6c 64 5b 69 5d 29  pgno, &apOld[i])
2dc00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2dc10 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 70 4f        memset(apO
2dc20 6c 64 2c 20 30 2c 20 69 2a 73 69 7a 65 6f 66 28  ld, 0, i*sizeof(
2dc30 4d 65 6d 50 61 67 65 2a 29 29 3b 0a 20 20 20 20  MemPage*));.    
2dc40 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
2dc50 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 0a 20 20  leanup;.    }.  
2dc60 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31    nMaxCells += 1
2dc70 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c  +apOld[i]->nCell
2dc80 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72  +apOld[i]->nOver
2dc90 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 28 69  flow;.    if( (i
2dca0 2d 2d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  --)==0 ) break;.
2dcb0 0a 20 20 20 20 69 66 28 20 70 50 61 72 65 6e 74  .    if( pParent
2dcc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 26 26 20 69  ->nOverflow && i
2dcd0 2b 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d  +nxDiv==pParent-
2dce0 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 20 29 7b  >aOvfl[0].idx ){
2dcf0 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20  .      apDiv[i] 
2dd00 3d 20 70 50 61 72 65 6e 74 2d 3e 61 4f 76 66 6c  = pParent->aOvfl
2dd10 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 20 20 20  [0].pCell;.     
2dd20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
2dd30 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20  (apDiv[i]);.    
2dd40 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 63 65 6c    szNew[i] = cel
2dd50 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74  lSizePtr(pParent
2dd60 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20  , apDiv[i]);.   
2dd70 20 20 20 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65     pParent->nOve
2dd80 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  rflow = 0;.    }
2dd90 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 70 44 69  else{.      apDi
2dda0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
2ddb0 70 50 61 72 65 6e 74 2c 20 69 2b 6e 78 44 69 76  pParent, i+nxDiv
2ddc0 2d 70 50 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66  -pParent->nOverf
2ddd0 6c 6f 77 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f  low);.      pgno
2dde0 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44 69   = get4byte(apDi
2ddf0 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73 7a 4e  v[i]);.      szN
2de00 65 77 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ew[i] = cellSize
2de10 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2de20 69 76 5b 69 5d 29 3b 0a 0a 20 20 20 20 20 20 2f  iv[i]);..      /
2de30 2a 20 44 72 6f 70 20 74 68 65 20 63 65 6c 6c 20  * Drop the cell 
2de40 66 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 20  from the parent 
2de50 70 61 67 65 2e 20 61 70 44 69 76 5b 69 5d 20 73  page. apDiv[i] s
2de60 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 0a 20  till points to. 
2de70 20 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c       ** the cell
2de80 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 72 65   within the pare
2de90 6e 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20  nt, even though 
2dea0 69 74 20 68 61 73 20 62 65 65 6e 20 64 72 6f 70  it has been drop
2deb0 70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  ped..      ** Th
2dec0 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61 75  is is safe becau
2ded0 73 65 20 64 72 6f 70 70 69 6e 67 20 61 20 63 65  se dropping a ce
2dee0 6c 6c 20 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74  ll only overwrit
2def0 65 73 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  es the first.   
2df00 20 20 20 2a 2a 20 66 6f 75 72 20 62 79 74 65 73     ** four bytes
2df10 20 6f 66 20 69 74 2c 20 61 6e 64 20 74 68 69 73   of it, and this
2df20 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
2df30 6f 74 20 6e 65 65 64 20 74 68 65 20 66 69 72 73  ot need the firs
2df40 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 75 72 20  t.      ** four 
2df50 62 79 74 65 73 20 6f 66 20 74 68 65 20 64 69 76  bytes of the div
2df60 69 64 65 72 20 63 65 6c 6c 2e 20 53 6f 20 74 68  ider cell. So th
2df70 65 20 70 6f 69 6e 74 65 72 20 69 73 20 73 61 66  e pointer is saf
2df80 65 20 74 6f 20 75 73 65 0a 20 20 20 20 20 20 2a  e to use.      *
2df90 2a 20 6c 61 74 65 72 20 6f 6e 2e 20 20 0a 20 20  * later on.  .  
2dfa0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2dfb0 55 6e 6c 65 73 73 20 53 51 4c 69 74 65 20 69 73  Unless SQLite is
2dfc0 20 63 6f 6d 70 69 6c 65 64 20 69 6e 20 73 65 63   compiled in sec
2dfd0 75 72 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 2e  ure-delete mode.
2dfe0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 20   In this case,. 
2dff0 20 20 20 20 20 2a 2a 20 74 68 65 20 64 72 6f 70       ** the drop
2e000 43 65 6c 6c 28 29 20 72 6f 75 74 69 6e 65 20 77  Cell() routine w
2e010 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
2e020 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 77 69  e entire cell wi
2e030 74 68 20 7a 65 72 6f 65 73 2e 0a 20 20 20 20 20  th zeroes..     
2e040 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   ** In this case
2e050 2c 20 74 65 6d 70 6f 72 61 72 69 6c 79 20 63 6f  , temporarily co
2e060 70 79 20 74 68 65 20 63 65 6c 6c 20 69 6e 74 6f  py the cell into
2e070 20 74 68 65 20 61 4f 76 66 6c 53 70 61 63 65 5b   the aOvflSpace[
2e080 5d 0a 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65  ].      ** buffe
2e090 72 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 63 6f  r. It will be co
2e0a0 70 69 65 64 20 6f 75 74 20 61 67 61 69 6e 20 61  pied out again a
2e0b0 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 61 53  s soon as the aS
2e0c0 70 61 63 65 5b 5d 20 62 75 66 66 65 72 0a 20 20  pace[] buffer.  
2e0d0 20 20 20 20 2a 2a 20 69 73 20 61 6c 6c 6f 63 61      ** is alloca
2e0e0 74 65 64 2e 20 20 2a 2f 0a 23 69 66 64 65 66 20  ted.  */.#ifdef 
2e0f0 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45  SQLITE_SECURE_DE
2e100 4c 45 54 45 0a 20 20 20 20 20 20 6d 65 6d 63 70  LETE.      memcp
2e110 79 28 26 61 4f 76 66 6c 53 70 61 63 65 5b 61 70  y(&aOvflSpace[ap
2e120 44 69 76 5b 69 5d 2d 70 50 61 72 65 6e 74 2d 3e  Div[i]-pParent->
2e130 61 44 61 74 61 5d 2c 20 61 70 44 69 76 5b 69 5d  aData], apDiv[i]
2e140 2c 20 73 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20  , szNew[i]);.   
2e150 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 26 61     apDiv[i] = &a
2e160 4f 76 66 6c 53 70 61 63 65 5b 61 70 44 69 76 5b  OvflSpace[apDiv[
2e170 69 5d 2d 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  i]-pParent->aDat
2e180 61 5d 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  a];.#endif.     
2e190 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
2e1a0 74 2c 20 69 2b 6e 78 44 69 76 2d 70 50 61 72 65  t, i+nxDiv-pPare
2e1b0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2c 20 73  nt->nOverflow, s
2e1c0 7a 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zNew[i]);.    }.
2e1d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
2e1e0 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
2e1f0 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
2e200 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
2e210 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
2e220 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
2e230 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
2e240 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
2e250 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
2e260 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
2e270 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
2e280 6b 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  k = pBt->pageSiz
2e290 65 20 2b 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e + ROUND8(sizeo
2e2a0 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 73  f(MemPage));.  s
2e2b0 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20  zScratch =.     
2e2c0 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65    nMaxCells*size
2e2d0 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20  of(u8*)         
2e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e2f0 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   apCell */.     
2e300 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65  + nMaxCells*size
2e310 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20  of(u16)         
2e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e330 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20   szCell */.     
2e340 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
2e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e370 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
2e380 20 2b 20 6b 2a 6e 4f 6c 64 3b 20 20 20 20 20 20   + k*nOld;      
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e3b0 2a 20 50 61 67 65 20 63 6f 70 69 65 73 20 28 61  * Page copies (a
2e3c0 70 43 6f 70 79 29 20 2a 2f 0a 20 20 61 70 43 65  pCopy) */.  apCe
2e3d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ll = sqlite3Scra
2e3e0 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72  tchMalloc( szScr
2e3f0 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61  atch ); .  if( a
2e400 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  pCell==0 ){.    
2e410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e420 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  M;.    goto bala
2e430 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
2e440 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36  .  szCell = (u16
2e450 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&apCell[nMaxCe
2e460 6c 6c 73 5d 3b 0a 20 20 61 53 70 61 63 65 31 20  lls];.  aSpace1 
2e470 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
2e480 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
2e490 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
2e4a0 41 4c 49 47 4e 4d 45 4e 54 28 61 53 70 61 63 65  ALIGNMENT(aSpace
2e4b0 31 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  1) );..  /*.  **
2e4c0 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74   Load pointers t
2e4d0 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73  o all cells on s
2e4e0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64  ibling pages and
2e4f0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
2e500 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  ls.  ** into the
2e510 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20   local apCell[] 
2e520 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70  array.  Make cop
2e530 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69 64  ies of the divid
2e540 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e  er cells.  ** in
2e550 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  to space obtaine
2e560 64 20 66 72 6f 6d 20 61 53 70 61 63 65 31 5b 5d  d from aSpace1[]
2e570 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20   and remove the 
2e580 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c  the divider Cell
2e590 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72  s.  ** from pPar
2e5a0 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ent..  **.  ** I
2e5b0 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61  f the siblings a
2e5c0 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73  re on leaf pages
2e5d0 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64  , then the child
2e5e0 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65   pointers of the
2e5f0 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65  .  ** divider ce
2e600 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65 64  lls are stripped
2e610 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20   from the cells 
2e620 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
2e630 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f  copied.  ** into
2e640 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20   aSpace1[].  In 
2e650 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65  this way, all ce
2e660 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
2e670 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a  are without.  **
2e680 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e   child pointers.
2e690 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72    If siblings ar
2e6a0 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68  e not leaves, th
2e6b0 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20  en all cell in. 
2e6c0 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63   ** apCell[] inc
2e6d0 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  lude child point
2e6e0 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  ers.  Either way
2e6f0 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  , all cells in a
2e700 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65  pCell[].  ** are
2e710 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a   alike..  **.  *
2e720 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  * leafCorrection
2e730 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69 73  :  4 if pPage is
2e740 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70   a leaf.  0 if p
2e750 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  Page is not a le
2e760 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c  af..  **       l
2e770 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20 70  eafData:  1 if p
2e780 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64  Page holds key+d
2e790 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20  ata and pParent 
2e7a0 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e  holds only keys.
2e7b0 0a 20 20 2a 2f 0a 20 20 6c 65 61 66 43 6f 72 72  .  */.  leafCorr
2e7c0 65 63 74 69 6f 6e 20 3d 20 61 70 4f 6c 64 5b 30  ection = apOld[0
2e7d0 5d 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61  ]->leaf*4;.  lea
2e7e0 66 44 61 74 61 20 3d 20 61 70 4f 6c 64 5b 30 5d  fData = apOld[0]
2e7f0 2d 3e 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72  ->hasData;.  for
2e800 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
2e810 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  +){.    int limi
2e820 74 3b 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 42  t;.    .    /* B
2e830 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
2e840 68 69 6e 67 20 65 6c 73 65 2c 20 74 61 6b 65 20  hing else, take 
2e850 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 27  a copy of the i'
2e860 74 68 20 6f 72 69 67 69 6e 61 6c 20 73 69 62 6c  th original sibl
2e870 69 6e 67 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  ing.    ** The r
2e880 65 73 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63  est of this func
2e890 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61  tion will use da
2e8a0 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69  ta from the copi
2e8b0 65 73 20 72 61 74 68 65 72 0a 20 20 20 20 2a 2a  es rather.    **
2e8c0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
2e8d0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
2e8e0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
2e8f0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
2e900 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
2e910 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  of being overwri
2e920 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20 20 4d 65  tten.  */.    Me
2e930 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70  mPage *pOld = ap
2e940 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61  Copy[i] = (MemPa
2e950 67 65 2a 29 26 61 53 70 61 63 65 31 5b 70 42 74  ge*)&aSpace1[pBt
2e960 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 6b 2a 69  ->pageSize + k*i
2e970 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
2e980 6c 64 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  ld, apOld[i], si
2e990 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
2e9a0 20 20 20 20 70 4f 6c 64 2d 3e 61 44 61 74 61 20      pOld->aData 
2e9b0 3d 20 28 76 6f 69 64 2a 29 26 70 4f 6c 64 5b 31  = (void*)&pOld[1
2e9c0 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 4f  ];.    memcpy(pO
2e9d0 6c 64 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  ld->aData, apOld
2e9e0 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
2e9f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 20  >pageSize);..   
2ea00 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e   limit = pOld->n
2ea10 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72  Cell+pOld->nOver
2ea20 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  flow;.    for(j=
2ea30 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29  0; j<limit; j++)
2ea40 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2ea50 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20  nCell<nMaxCells 
2ea60 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  );.      apCell[
2ea70 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65  nCell] = findOve
2ea80 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20  rflowCell(pOld, 
2ea90 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c  j);.      szCell
2eaa0 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69  [nCell] = cellSi
2eab0 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65  zePtr(pOld, apCe
2eac0 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20  ll[nCell]);.    
2ead0 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d    nCell++;.    }
2eae0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d  .    if( i<nOld-
2eaf0 31 20 26 26 20 21 6c 65 61 66 44 61 74 61 29 7b  1 && !leafData){
2eb00 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
2eb10 28 75 31 36 29 73 7a 4e 65 77 5b 69 5d 3b 0a 20  (u16)szNew[i];. 
2eb20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a       u8 *pTemp;.
2eb30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
2eb40 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
2eb50 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43  .      szCell[nC
2eb60 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20  ell] = sz;.     
2eb70 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
2eb80 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20 20  1[iSpace1];.    
2eb90 20 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b    iSpace1 += sz;
2eba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
2ebb0 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  z<=pBt->pageSize
2ebc0 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  /4 );.      asse
2ebd0 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74  rt( iSpace1<=pBt
2ebe0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
2ebf0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
2ec00 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
2ec10 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43  .      apCell[nC
2ec20 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61  ell] = pTemp+lea
2ec30 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
2ec40 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2ec50 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
2ec60 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2ec70 34 20 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c  4 );.      szCel
2ec80 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 43 65 6c  l[nCell] = szCel
2ec90 6c 5b 6e 43 65 6c 6c 5d 20 2d 20 6c 65 61 66 43  l[nCell] - leafC
2eca0 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
2ecb0 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66   if( !pOld->leaf
2ecc0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2ecd0 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
2ece0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
2ecf0 20 61 73 73 65 72 74 28 20 70 4f 6c 64 2d 3e 68   assert( pOld->h
2ed00 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 0a 20  drOffset==0 );. 
2ed10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
2ed20 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
2ed30 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
2ed40 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
2ed50 65 66 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  eft.        ** p
2ed60 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69  ointer of the di
2ed70 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
2ed80 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
2ed90 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
2eda0 64 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b  d->aData[8], 4);
2edb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2edc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65        assert( le
2edd0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20  afCorrection==4 
2ede0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2edf0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29  zCell[nCell]<4 )
2ee00 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  {.          /* D
2ee10 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20  o not allow any 
2ee20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74 68  cells smaller th
2ee30 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a 20  an 4 bytes. */. 
2ee40 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b           szCell[
2ee50 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20  nCell] = 4;.    
2ee60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ee70 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
2ee80 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
2ee90 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65  * Figure out the
2eea0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
2eeb0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
2eec0 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e  all nCell cells.
2eed0 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69 73  .  ** Store this
2eee0 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e 20   number in "k". 
2eef0 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73 7a   Also compute sz
2ef00 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
2ef10 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73 69  he total.  ** si
2ef20 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2ef30 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67 65  on the i-th page
2ef40 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77 68   and cntNew[] wh
2ef50 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65 78  ich is the index
2ef60 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c 5b  .  ** in apCell[
2ef70 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68  ] of the cell th
2ef80 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65 20  at divides page 
2ef90 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31 2e  i from page i+1.
2efa0 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b    .  ** cntNew[k
2efb0 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20 6e  ] should equal n
2efc0 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Cell..  **.  ** 
2efd0 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64 20  Values computed 
2efe0 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a 20  by this block:. 
2eff0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
2f000 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c 20     k: The total 
2f010 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
2f020 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20 20  g pages.  **    
2f030 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65 64  szNew[i]: Spaced
2f040 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d 74   used on the i-t
2f050 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
2f060 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69 5d    **   cntNew[i]
2f070 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65 6c  : Index in apCel
2f080 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d  l[] and szCell[]
2f090 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 63   for the first c
2f0a0 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20 20  ell to.  **     
2f0b0 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69 67           the rig
2f0c0 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20 73  ht of the i-th s
2f0d0 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a  ibling page..  *
2f0e0 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20 4e  * usableSpace: N
2f0f0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
2f100 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  f space availabl
2f110 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69 6e  e on each siblin
2f120 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20  g..  ** .  */.  
2f130 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70 42  usableSpace = pB
2f140 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
2f150 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74  12 + leafCorrect
2f160 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74 6f  ion;.  for(subto
2f170 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65  tal=k=i=0; i<nCe
2f180 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  ll; i++){.    as
2f190 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c 6c  sert( i<nMaxCell
2f1a0 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74 61  s );.    subtota
2f1b0 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b  l += szCell[i] +
2f1c0 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62 74   2;.    if( subt
2f1d0 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70 61  otal > usableSpa
2f1e0 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e 65  ce ){.      szNe
2f1f0 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 20  w[k] = subtotal 
2f200 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  - szCell[i];.   
2f210 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69     cntNew[k] = i
2f220 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61 66  ;.      if( leaf
2f230 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20  Data ){ i--; }. 
2f240 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d 20       subtotal = 
2f250 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20  0;.      k++;.  
2f260 20 20 20 20 69 66 28 20 6b 3e 4e 42 2b 31 20 29      if( k>NB+1 )
2f270 7b 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  { rc = SQLITE_CO
2f280 52 52 55 50 54 3b 20 67 6f 74 6f 20 62 61 6c 61  RRUPT; goto bala
2f290 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 20 7d 0a 20  nce_cleanup; }. 
2f2a0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
2f2b0 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
2f2c0 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
2f2d0 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
2f2e0 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
2f2f0 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
2f300 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
2f310 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
2f320 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
2f330 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
2f340 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
2f350 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
2f360 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
2f370 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
2f380 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
2f390 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
2f3a0 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
2f3b0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
2f3c0 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
2f3d0 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
2f3e0 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
2f3f0 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
2f400 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
2f410 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
2f420 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
2f430 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
2f440 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
2f450 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
2f460 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
2f470 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
2f480 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
2f490 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
2f4a0 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
2f4b0 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
2f4c0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
2f4d0 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
2f4e0 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
2f4f0 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
2f500 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2f510 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
2f520 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
2f530 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
2f540 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
2f550 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
2f560 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
2f570 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
2f580 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
2f590 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2f5a0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
2f5b0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
2f5c0 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
2f5d0 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
2f5e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2f5f0 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
2f600 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
2f610 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
2f620 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
2f630 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
2f640 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
2f650 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
2f660 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
2f670 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
2f680 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
2f690 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
2f6a0 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
2f6b0 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
2f6c0 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
2f6d0 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
2f6e0 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
2f6f0 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
2f700 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
2f710 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
2f720 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
2f730 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
2f740 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
2f750 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
2f760 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
2f770 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
2f780 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
2f790 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
2f7a0 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
2f7b0 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
2f7c0 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 70 50  new[0])>0) or pP
2f7d0 61 67 65 20 69 73 0a 20 20 2a 2a 20 61 20 76 69  age is.  ** a vi
2f7e0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e  rtual root page.
2f7f0 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f 6f 74    A virtual root
2f800 20 70 61 67 65 20 69 73 20 77 68 65 6e 20 74 68   page is when th
2f810 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a  e real root.  **
2f820 20 70 61 67 65 20 69 73 20 70 61 67 65 20 31 20   page is page 1 
2f830 61 6e 64 20 77 65 20 61 72 65 20 74 68 65 20 6f  and we are the o
2f840 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74 68 61  nly child of tha
2f850 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61  t page..  */.  a
2f860 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d  ssert( cntNew[0]
2f870 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e  >0 || (pParent->
2f880 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61 72 65  pgno==1 && pPare
2f890 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b  nt->nCell==0) );
2f8a0 0a 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ..  TRACE(("BALA
2f8b0 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20  NCE: old: %d %d 
2f8c0 25 64 20 20 22 2c 0a 20 20 20 20 61 70 4f 6c 64  %d  ",.    apOld
2f8d0 5b 30 5d 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20 20  [0]->pgno, .    
2f8e0 6e 4f 6c 64 3e 3d 32 20 3f 20 61 70 4f 6c 64 5b  nOld>=2 ? apOld[
2f8f0 31 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 0a 20 20  1]->pgno : 0,.  
2f900 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 61 70 4f 6c    nOld>=3 ? apOl
2f910 64 5b 32 5d 2d 3e 70 67 6e 6f 20 3a 20 30 0a 20  d[2]->pgno : 0. 
2f920 20 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20   ));..  /*.  ** 
2f930 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
2f940 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
2f950 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
2f960 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  sible..  */.  if
2f970 28 20 61 70 4f 6c 64 5b 30 5d 2d 3e 70 67 6e 6f  ( apOld[0]->pgno
2f980 3c 3d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  <=1 ){.    rc = 
2f990 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
2f9a0 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2f9b0 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
2f9c0 70 61 67 65 46 6c 61 67 73 20 3d 20 61 70 4f 6c  pageFlags = apOl
2f9d0 64 5b 30 5d 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a  d[0]->aData[0];.
2f9e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
2f9f0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
2fa00 65 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28  e *pNew;.    if(
2fa10 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20   i<nOld ){.     
2fa20 20 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d   pNew = apNew[i]
2fa30 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20   = apOld[i];.   
2fa40 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b     apOld[i] = 0;
2fa50 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2fa60 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e  te3PagerWrite(pN
2fa70 65 77 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ew->pDbPage);.  
2fa80 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20      nNew++;.    
2fa90 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2faa0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
2fab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fac0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
2fad0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
2fae0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2faf0 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 2c  t, &pNew, &pgno,
2fb00 20 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20   pgno, 0);.     
2fb10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2fb20 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2fb30 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d        apNew[i] =
2fb40 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e 65   pNew;.      nNe
2fb50 77 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  w++;..      /* S
2fb60 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
2fb70 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ap entry for the
2fb80 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67   new sibling pag
2fb90 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
2fba0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2fbb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2fbc0 6d 61 70 50 75 74 28 70 42 74 2c 20 70 4e 65 77  mapPut(pBt, pNew
2fbd0 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ->pgno, PTRMAP_B
2fbe0 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
2fbf0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
2fc00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fc10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2fc20 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2fc30 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
2fc40 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2fc50 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
2fc60 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
2fc70 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
2fc80 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
2fc90 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
2fca0 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
2fcb0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
2fcc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2fcd0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2fce0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
2fcf0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
2fd00 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
2fd10 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
2fd20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
2fd30 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
2fd40 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
2fd50 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
2fd60 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
2fd70 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
2fd80 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
2fd90 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
2fda0 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
2fdb0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
2fdc0 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
2fdd0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
2fde0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
2fdf0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
2fe00 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
2fe10 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
2fe20 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
2fe30 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
2fe40 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
2fe50 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
2fe60 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
2fe70 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
2fe80 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
2fe90 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
2fea0 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
2feb0 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
2fec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
2fed0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
2fee0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
2fef0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
2ff00 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
2ff10 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
2ff20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
2ff30 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
2ff40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
2ff50 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
2ff60 69 6e 56 20 3d 20 61 70 4e 65 77 5b 69 5d 2d 3e  inV = apNew[i]->
2ff70 70 67 6e 6f 3b 0a 20 20 20 20 69 6e 74 20 6d 69  pgno;.    int mi
2ff80 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
2ff90 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
2ffa0 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 4e 65  {.      if( apNe
2ffb0 77 5b 6a 5d 2d 3e 70 67 6e 6f 3c 28 75 6e 73 69  w[j]->pgno<(unsi
2ffc0 67 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20  gned)minV ){.   
2ffd0 20 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20       minI = j;. 
2ffe0 20 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 61 70         minV = ap
2fff0 4e 65 77 5b 6a 5d 2d 3e 70 67 6e 6f 3b 0a 20 20  New[j]->pgno;.  
30000 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
30010 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
30020 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
30030 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
30040 20 20 20 20 74 20 3d 20 61 70 4e 65 77 5b 69 5d      t = apNew[i]
30050 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 70 54  ->pgno;.      pT
30060 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
30070 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70     apNew[i] = ap
30080 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
30090 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
300a0 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
300b0 52 41 43 45 28 28 22 6e 65 77 3a 20 25 64 28 25  RACE(("new: %d(%
300c0 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29  d) %d(%d) %d(%d)
300d0 20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e   %d(%d) %d(%d)\n
300e0 22 2c 0a 20 20 20 20 61 70 4e 65 77 5b 30 5d 2d  ",.    apNew[0]-
300f0 3e 70 67 6e 6f 2c 20 73 7a 4e 65 77 5b 30 5d 2c  >pgno, szNew[0],
30100 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 61  .    nNew>=2 ? a
30110 70 4e 65 77 5b 31 5d 2d 3e 70 67 6e 6f 20 3a 20  pNew[1]->pgno : 
30120 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e  0, nNew>=2 ? szN
30130 65 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[1] : 0,.    n
30140 4e 65 77 3e 3d 33 20 3f 20 61 70 4e 65 77 5b 32  New>=3 ? apNew[2
30150 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c 20 6e 4e 65  ]->pgno : 0, nNe
30160 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
30170 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
30180 20 3f 20 61 70 4e 65 77 5b 33 5d 2d 3e 70 67 6e   ? apNew[3]->pgn
30190 6f 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  o : 0, nNew>=4 ?
301a0 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
301b0 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 61 70 4e     nNew>=5 ? apN
301c0 65 77 5b 34 5d 2d 3e 70 67 6e 6f 20 3a 20 30 2c  ew[4]->pgno : 0,
301d0 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
301e0 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 61 73  [4] : 0));..  as
301f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
30200 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
30210 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20  arent->pDbPage) 
30220 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 70 52  );.  put4byte(pR
30230 69 67 68 74 2c 20 61 70 4e 65 77 5b 6e 4e 65 77  ight, apNew[nNew
30240 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 2f  -1]->pgno);..  /
30250 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
30260 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
30270 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
30280 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
30290 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
302a0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
302b0 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
302c0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
302d0 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
302e0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
302f0 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
30300 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
30310 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
30320 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
30330 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
30340 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
30350 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
30360 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b  New, pageFlags);
30370 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
30380 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69  e(pNew, cntNew[i
30390 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c  ]-j, &apCell[j],
303a0 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20   &szCell[j]);.  
303b0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
303c0 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77  nCell>0 || (nNew
303d0 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d  ==1 && cntNew[0]
303e0 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ==0) );.    asse
303f0 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66  rt( pNew->nOverf
30400 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 6a  low==0 );..    j
30410 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20   = cntNew[i];.. 
30420 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62     /* If the sib
30430 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62  ling page assemb
30440 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f  led above was no
30450 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
30460 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a   sibling,.    **
30470 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65   insert a divide
30480 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20  r cell into the 
30490 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20  parent page..   
304a0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
304b0 69 3c 6e 4e 65 77 2d 31 20 7c 7c 20 6a 3d 3d 6e  i<nNew-1 || j==n
304c0 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69 66 28 20  Cell );.    if( 
304d0 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
304e0 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
304f0 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
30500 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
30510 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
30520 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
30530 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
30540 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
30550 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
30560 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70  rection;.      p
30570 54 65 6d 70 20 3d 20 26 61 4f 76 66 6c 53 70 61  Temp = &aOvflSpa
30580 63 65 5b 69 4f 76 66 6c 53 70 61 63 65 5d 3b 0a  ce[iOvflSpace];.
30590 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d        if( !pNew-
305a0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
305b0 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61   memcpy(&pNew->a
305c0 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20  Data[8], pCell, 
305d0 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  4);.      }else 
305e0 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
305f0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
30600 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61 66  e tree is a leaf
30610 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20  -data tree, and 
30620 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
30630 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20   leaves, .      
30640 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
30650 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65  is no divider ce
30660 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20  ll in apCell[]. 
30670 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69 76  Instead, the div
30680 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a  ider .        **
30690 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
306a0 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  f the integer ke
306b0 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  y for the right-
306c0 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20  most cell of .  
306d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62        ** the sib
306e0 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62  ling-page assemb
306f0 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a  led above only..
30700 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30710 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
30720 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20  ;.        j--;. 
30730 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
30740 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
30750 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c  pNew, apCell[j],
30760 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20   &info);.       
30770 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a   pCell = pTemp;.
30780 20 20 20 20 20 20 20 20 73 7a 20 3d 20 34 20 2b          sz = 4 +
30790 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
307a0 6c 5b 34 5d 2c 20 69 6e 66 6f 2e 6e 4b 65 79 29  l[4], info.nKey)
307b0 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
307c0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
307d0 7b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20  {.        pCell 
307e0 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a  -= 4;.        /*
307f0 20 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f   Obscure case fo
30800 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20  r non-leaf-data 
30810 74 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65  trees: If the ce
30820 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a  ll at pCell was.
30830 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69          ** previ
30840 6f 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20  ously stored on 
30850 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64  a leaf node, and
30860 20 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69   its reported si
30870 7a 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20  ze was 4.       
30880 20 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20   ** bytes, then 
30890 69 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20  it may actually 
308a0 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  be smaller than 
308b0 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  this .        **
308c0 20 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72   (see sqlite3Btr
308d0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
308e0 2c 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65  , 4 bytes is the
308f0 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66   minimum size of
30900 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20  .        ** any 
30910 63 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73  cell). But it is
30920 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61   important to pa
30930 73 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ss the correct s
30940 69 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20  ize to .        
30950 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c  ** insertCell(),
30960 20 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20   so reparse the 
30970 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20  cell now..      
30980 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
30990 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63  Note that this c
309a0 61 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20  an never happen 
309b0 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
309c0 61 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20  a file, as all. 
309d0 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20         ** cells 
309e0 61 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62  are at least 4 b
309f0 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61  ytes. It only ha
30a00 70 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73  ppens in b-trees
30a10 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a   used.        **
30a20 20 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e   to evaluate "IN
30a30 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61   (SELECT ...)" a
30a40 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73  nd similar claus
30a50 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
30a60 20 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c         if( szCel
30a70 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20  l[j]==4 ){.     
30a80 20 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66       assert(leaf
30a90 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a  Correction==4);.
30aa0 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63            sz = c
30ab0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65  ellSizePtr(pPare
30ac0 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  nt, pCell);.    
30ad0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30ae0 20 20 20 20 69 4f 76 66 6c 53 70 61 63 65 20 2b      iOvflSpace +
30af0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
30b00 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
30b10 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
30b20 20 61 73 73 65 72 74 28 20 69 4f 76 66 6c 53 70   assert( iOvflSp
30b30 61 63 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ace<=pBt->pageSi
30b40 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
30b50 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
30b60 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
30b70 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 70 4e  l, sz, pTemp, pN
30b80 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
30b90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30ba0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
30bb0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
30bc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
30bd0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
30be0 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
30bf0 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 6a 2b 2b  e) );..      j++
30c00 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b  ;.      nxDiv++;
30c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
30c20 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b  ert( j==nCell );
30c30 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e  .  assert( nOld>
30c40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
30c50 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28  New>0 );.  if( (
30c60 70 61 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f  pageFlags & PTF_
30c70 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LEAF)==0 ){.    
30c80 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20 26 61 70  u8 *zChild = &ap
30c90 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44  Copy[nOld-1]->aD
30ca0 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d 65 6d 63  ata[8];.    memc
30cb0 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31  py(&apNew[nNew-1
30cc0 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 7a 43 68  ]->aData[8], zCh
30cd0 69 6c 64 2c 20 34 29 3b 0a 20 20 7d 0a 0a 20 20  ild, 4);.  }..  
30ce0 69 66 28 20 69 73 52 6f 6f 74 20 26 26 20 70 50  if( isRoot && pP
30cf0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  arent->nCell==0 
30d00 26 26 20 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  && pParent->hdrO
30d10 66 66 73 65 74 3c 3d 61 70 4e 65 77 5b 30 5d 2d  ffset<=apNew[0]-
30d20 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 2f 2a  >nFree ){.    /*
30d30 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   The root page o
30d40 66 20 74 68 65 20 62 2d 74 72 65 65 20 6e 6f 77  f the b-tree now
30d50 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
30d60 6c 73 2e 20 54 68 65 20 6f 6e 6c 79 20 73 69 62  ls. The only sib
30d70 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 70 61 67 65  ling.    ** page
30d80 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
30d90 69 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ild of the paren
30da0 74 2e 20 43 6f 70 79 20 74 68 65 20 63 6f 6e 74  t. Copy the cont
30db0 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
30dc0 2a 2a 20 63 68 69 6c 64 20 70 61 67 65 20 69 6e  ** child page in
30dd0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2c 20 64  to the parent, d
30de0 65 63 72 65 61 73 69 6e 67 20 74 68 65 20 6f 76  ecreasing the ov
30df0 65 72 61 6c 6c 20 68 65 69 67 68 74 20 6f 66 20  erall height of 
30e00 74 68 65 0a 20 20 20 20 2a 2a 20 62 2d 74 72 65  the.    ** b-tre
30e10 65 20 73 74 72 75 63 74 75 72 65 20 62 79 20 6f  e structure by o
30e20 6e 65 2e 20 54 68 69 73 20 69 73 20 64 65 73 63  ne. This is desc
30e30 72 69 62 65 64 20 61 73 20 74 68 65 20 22 62 61  ribed as the "ba
30e40 6c 61 6e 63 65 2d 73 68 61 6c 6c 6f 77 65 72 22  lance-shallower"
30e50 0a 20 20 20 20 2a 2a 20 73 75 62 2d 61 6c 67 6f  .    ** sub-algo
30e60 72 69 74 68 6d 20 69 6e 20 73 6f 6d 65 20 64 6f  rithm in some do
30e70 63 75 6d 65 6e 74 61 74 69 6f 6e 2e 0a 20 20 20  cumentation..   
30e80 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
30e90 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61  is is an auto-va
30ea0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 74  cuum database, t
30eb0 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 70 79 4e  he call to copyN
30ec0 6f 64 65 43 6f 6e 74 65 6e 74 28 29 20 0a 20 20  odeContent() .  
30ed0 20 20 2a 2a 20 73 65 74 73 20 61 6c 6c 20 70 6f    ** sets all po
30ee0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
30ef0 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  s corresponding 
30f00 74 6f 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  to database imag
30f10 65 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  e pages .    ** 
30f20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 6f  for which the po
30f30 69 6e 74 65 72 20 69 73 20 73 74 6f 72 65 64 20  inter is stored 
30f40 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e 74 65  within the conte
30f50 6e 74 20 62 65 69 6e 67 20 63 6f 70 69 65 64 2e  nt being copied.
30f60 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
30f70 68 65 20 73 65 63 6f 6e 64 20 61 73 73 65 72 74  he second assert
30f80 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
30f90 74 68 61 74 20 74 68 65 20 63 68 69 6c 64 20 70  that the child p
30fa0 61 67 65 20 69 73 20 64 65 66 72 61 67 6d 65 6e  age is defragmen
30fb0 74 65 64 0a 20 20 20 20 2a 2a 20 28 69 74 20 6d  ted.    ** (it m
30fc0 75 73 74 20 62 65 2c 20 61 73 20 69 74 20 77 61  ust be, as it wa
30fd0 73 20 6a 75 73 74 20 72 65 63 6f 6e 73 74 72 75  s just reconstru
30fe0 63 74 65 64 20 75 73 69 6e 67 20 61 73 73 65 6d  cted using assem
30ff0 62 6c 65 50 61 67 65 28 29 29 2e 20 54 68 69 73  blePage()). This
31000 0a 20 20 20 20 2a 2a 20 69 73 20 69 6d 70 6f 72  .    ** is impor
31010 74 61 6e 74 20 69 66 20 74 68 65 20 70 61 72 65  tant if the pare
31020 6e 74 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  nt page happens 
31030 74 6f 20 62 65 20 70 61 67 65 20 31 20 6f 66 20  to be page 1 of 
31040 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
31050 20 2a 2a 20 69 6d 61 67 65 2e 20 20 2a 2f 0a 20   ** image.  */. 
31060 20 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3d     assert( nNew=
31070 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
31080 28 20 61 70 4e 65 77 5b 30 5d 2d 3e 6e 46 72 65  ( apNew[0]->nFre
31090 65 20 3d 3d 20 0a 20 20 20 20 20 20 20 20 28 67  e == .        (g
310a0 65 74 32 62 79 74 65 28 26 61 70 4e 65 77 5b 30  et2byte(&apNew[0
310b0 5d 2d 3e 61 44 61 74 61 5b 35 5d 29 2d 61 70 4e  ]->aData[5])-apN
310c0 65 77 5b 30 5d 2d 3e 63 65 6c 6c 4f 66 66 73 65  ew[0]->cellOffse
310d0 74 2d 61 70 4e 65 77 5b 30 5d 2d 3e 6e 43 65 6c  t-apNew[0]->nCel
310e0 6c 2a 32 29 20 0a 20 20 20 20 29 3b 0a 20 20 20  l*2) .    );.   
310f0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
31100 28 72 63 20 3d 20 63 6f 70 79 4e 6f 64 65 43 6f  (rc = copyNodeCo
31110 6e 74 65 6e 74 28 61 70 4e 65 77 5b 30 5d 2c 20  ntent(apNew[0], 
31120 70 50 61 72 65 6e 74 29 29 20 29 7b 0a 20 20 20  pParent)) ){.   
31130 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
31140 28 61 70 4e 65 77 5b 30 5d 29 3b 0a 20 20 20 20  (apNew[0]);.    
31150 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 49 53  }.  }else if( IS
31160 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
31170 20 20 2f 2a 20 46 69 78 20 74 68 65 20 70 6f 69    /* Fix the poi
31180 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
31190 20 66 6f 72 20 61 6c 6c 20 74 68 65 20 63 65 6c   for all the cel
311a0 6c 73 20 74 68 61 74 20 77 65 72 65 20 73 68 69  ls that were shi
311b0 66 74 65 64 20 61 72 6f 75 6e 64 2e 20 0a 20 20  fted around. .  
311c0 20 20 2a 2a 20 54 68 65 72 65 20 61 72 65 20 73    ** There are s
311d0 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e 74  everal different
311e0 20 74 79 70 65 73 20 6f 66 20 70 6f 69 6e 74 65   types of pointe
311f0 72 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 74 68  r-map entries th
31200 61 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 2a  at need to.    *
31210 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74 68 20  * be dealt with 
31220 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
31230 20 53 6f 6d 65 20 6f 66 20 74 68 65 73 65 20 68   Some of these h
31240 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 6c 72  ave been set alr
31250 65 61 64 79 2c 20 62 75 74 0a 20 20 20 20 2a 2a  eady, but.    **
31260 20 6d 61 6e 79 20 68 61 76 65 20 6e 6f 74 2e 20   many have not. 
31270 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
31280 20 61 20 73 75 6d 6d 61 72 79 3a 0a 20 20 20 20   a summary:.    
31290 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 31 29 20 54  **.    **   1) T
312a0 68 65 20 65 6e 74 72 69 65 73 20 61 73 73 6f 63  he entries assoc
312b0 69 61 74 65 64 20 77 69 74 68 20 6e 65 77 20 73  iated with new s
312c0 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 68 61  ibling pages tha
312d0 74 20 77 65 72 65 20 6e 6f 74 0a 20 20 20 20 2a  t were not.    *
312e0 2a 20 20 20 20 20 20 73 69 62 6c 69 6e 67 73 20  *      siblings 
312f0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
31300 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 54  on was called. T
31310 68 65 73 65 20 68 61 76 65 20 61 6c 72 65 61 64  hese have alread
31320 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 65  y.    **      be
31330 65 6e 20 73 65 74 2e 20 57 65 20 64 6f 6e 27 74  en set. We don't
31340 20 6e 65 65 64 20 74 6f 20 77 6f 72 72 79 20 61   need to worry a
31350 62 6f 75 74 20 6f 6c 64 20 73 69 62 6c 69 6e 67  bout old sibling
31360 73 20 74 68 61 74 20 77 65 72 65 0a 20 20 20 20  s that were.    
31370 2a 2a 20 20 20 20 20 20 6d 6f 76 65 64 20 74 6f  **      moved to
31380 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2d   the free-list -
31390 20 74 68 65 20 66 72 65 65 50 61 67 65 28 29 20   the freePage() 
313a0 63 6f 64 65 20 68 61 73 20 74 61 6b 65 6e 20 63  code has taken c
313b0 61 72 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  are.    **      
313c0 6f 66 20 74 68 6f 73 65 2e 0a 20 20 20 20 2a 2a  of those..    **
313d0 0a 20 20 20 20 2a 2a 20 20 20 32 29 20 54 68 65  .    **   2) The
313e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
313f0 72 69 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ries associated 
31400 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20 6f  with the first o
31410 76 65 72 66 6c 6f 77 0a 20 20 20 20 2a 2a 20 20  verflow.    **  
31420 20 20 20 20 70 61 67 65 20 69 6e 20 61 6e 79 20      page in any 
31430 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 73 20  overflow chains 
31440 75 73 65 64 20 62 79 20 6e 65 77 20 64 69 76 69  used by new divi
31450 64 65 72 20 63 65 6c 6c 73 2e 20 54 68 65 73 65  der cells. These
31460 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 68 61   .    **      ha
31470 76 65 20 61 6c 73 6f 20 61 6c 72 65 61 64 79 20  ve also already 
31480 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65 20  been taken care 
31490 6f 66 20 62 79 20 74 68 65 20 69 6e 73 65 72 74  of by the insert
314a0 43 65 6c 6c 28 29 20 63 6f 64 65 2e 0a 20 20 20  Cell() code..   
314b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 33 29 20   **.    **   3) 
314c0 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
314d0 61 67 65 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ages are not lea
314e0 76 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68  ves, then the ch
314f0 69 6c 64 20 70 61 67 65 73 20 6f 66 0a 20 20 20  ild pages of.   
31500 20 2a 2a 20 20 20 20 20 20 63 65 6c 6c 73 20 73   **      cells s
31510 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 73 69 62  tored on the sib
31520 6c 69 6e 67 20 70 61 67 65 73 20 6d 61 79 20 6e  ling pages may n
31530 65 65 64 20 74 6f 20 62 65 20 75 70 64 61 74 65  eed to be update
31540 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
31550 20 20 20 34 29 20 49 66 20 74 68 65 20 73 69 62     4) If the sib
31560 6c 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 6e  ling pages are n
31570 6f 74 20 69 6e 74 65 72 6e 61 6c 20 69 6e 74 6b  ot internal intk
31580 65 79 20 6e 6f 64 65 73 2c 20 74 68 65 6e 20 61  ey nodes, then a
31590 6e 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 6f  ny.    **      o
315a0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 75 73  verflow pages us
315b0 65 64 20 62 79 20 74 68 65 73 65 20 63 65 6c 6c  ed by these cell
315c0 73 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  s may need to be
315d0 20 75 70 64 61 74 65 64 0a 20 20 20 20 2a 2a 20   updated.    ** 
315e0 20 20 20 20 20 28 69 6e 74 65 72 6e 61 6c 20 69       (internal i
315f0 6e 74 6b 65 79 20 6e 6f 64 65 73 20 6e 65 76 65  ntkey nodes neve
31600 72 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  r contain pointe
31610 72 73 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  rs to overflow p
31620 61 67 65 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ages)..    **.  
31630 20 20 2a 2a 20 20 20 35 29 20 49 66 20 74 68 65    **   5) If the
31640 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
31650 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
31660 68 65 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  hen the pointer-
31670 6d 61 70 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  map.    **      
31680 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
31690 72 69 67 68 74 2d 63 68 69 6c 64 20 70 61 67 65  right-child page
316a0 73 20 6f 66 20 65 61 63 68 20 73 69 62 6c 69 6e  s of each siblin
316b0 67 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  g may need.    *
316c0 2a 20 20 20 20 20 20 74 6f 20 62 65 20 75 70 64  *      to be upd
316d0 61 74 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ated..    **.   
316e0 20 2a 2a 20 43 61 73 65 73 20 31 20 61 6e 64 20   ** Cases 1 and 
316f0 32 20 61 72 65 20 64 65 61 6c 74 20 77 69 74 68  2 are dealt with
31700 20 61 62 6f 76 65 20 62 79 20 6f 74 68 65 72 20   above by other 
31710 63 6f 64 65 2e 20 54 68 65 20 6e 65 78 74 0a 20  code. The next. 
31720 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 64 65 61 6c     ** block deal
31730 73 20 77 69 74 68 20 63 61 73 65 73 20 33 20 61  s with cases 3 a
31740 6e 64 20 34 20 61 6e 64 20 74 68 65 20 6f 6e 65  nd 4 and the one
31750 20 61 66 74 65 72 20 74 68 61 74 2c 20 63 61 73   after that, cas
31760 65 20 35 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a  e 5. Since.    *
31770 2a 20 73 65 74 74 69 6e 67 20 61 20 70 6f 69 6e  * setting a poin
31780 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 69 73  ter map entry is
31790 20 61 20 72 65 6c 61 74 69 76 65 6c 79 20 65 78   a relatively ex
317a0 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
317b0 6e 2c 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 63  n, this.    ** c
317c0 6f 64 65 20 6f 6e 6c 79 20 73 65 74 73 20 70 6f  ode only sets po
317d0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
317e0 73 20 66 6f 72 20 63 68 69 6c 64 20 6f 72 20 6f  s for child or o
317f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 74 68  verflow pages th
31800 61 74 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 61  at have.    ** a
31810 63 74 75 61 6c 6c 79 20 6d 6f 76 65 64 20 62 65  ctually moved be
31820 74 77 65 65 6e 20 70 61 67 65 73 2e 20 20 2a 2f  tween pages.  */
31830 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
31840 65 77 20 3d 20 61 70 4e 65 77 5b 30 5d 3b 0a 20  ew = apNew[0];. 
31850 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
31860 20 3d 20 61 70 43 6f 70 79 5b 30 5d 3b 0a 20 20   = apCopy[0];.  
31870 20 20 69 6e 74 20 6e 4f 76 65 72 66 6c 6f 77 20    int nOverflow 
31880 3d 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  = pOld->nOverflo
31890 77 3b 0a 20 20 20 20 69 6e 74 20 69 4e 65 78 74  w;.    int iNext
318a0 4f 6c 64 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c  Old = pOld->nCel
318b0 6c 20 2b 20 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20  l + nOverflow;. 
318c0 20 20 20 69 6e 74 20 69 4f 76 65 72 66 6c 6f 77     int iOverflow
318d0 20 3d 20 28 6e 4f 76 65 72 66 6c 6f 77 20 3f 20   = (nOverflow ? 
318e0 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
318f0 64 78 20 3a 20 2d 31 29 3b 0a 20 20 20 20 6a 20  dx : -1);.    j 
31900 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31920 20 2f 2a 20 43 75 72 72 65 6e 74 20 27 6f 6c 64   /* Current 'old
31930 27 20 73 69 62 6c 69 6e 67 20 70 61 67 65 20 2a  ' sibling page *
31940 2f 0a 20 20 20 20 6b 20 3d 20 30 3b 20 20 20 20  /.    k = 0;    
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31960 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
31970 65 6e 74 20 27 6e 65 77 27 20 73 69 62 6c 69 6e  ent 'new' siblin
31980 67 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 66 6f  g page */.    fo
31990 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 20 26  r(i=0; i<nCell &
319a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
319b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
319c0 20 69 73 44 69 76 69 64 65 72 20 3d 20 30 3b 0a   isDivider = 0;.
319d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3d 3d        while( i==
319e0 69 4e 65 78 74 4f 6c 64 20 29 7b 0a 20 20 20 20  iNextOld ){.    
319f0 20 20 20 20 2f 2a 20 43 65 6c 6c 20 69 20 69 73      /* Cell i is
31a00 20 74 68 65 20 63 65 6c 6c 20 69 6d 6d 65 64 69   the cell immedi
31a10 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
31a20 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 6f 6e  the last cell on
31a30 20 6f 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   old.        ** 
31a40 73 69 62 6c 69 6e 67 20 70 61 67 65 20 6a 2e 20  sibling page j. 
31a50 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
31a60 61 72 65 20 6e 6f 74 20 6c 65 61 66 20 70 61 67  are not leaf pag
31a70 65 73 20 6f 66 20 61 6e 0a 20 20 20 20 20 20 20  es of an.       
31a80 20 2a 2a 20 69 6e 74 6b 65 79 20 62 2d 74 72 65   ** intkey b-tre
31a90 65 2c 20 74 68 65 6e 20 63 65 6c 6c 20 69 20 77  e, then cell i w
31aa0 61 73 20 61 20 64 69 76 69 64 65 72 20 63 65 6c  as a divider cel
31ab0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4f  l. */.        pO
31ac0 6c 64 20 3d 20 61 70 43 6f 70 79 5b 2b 2b 6a 5d  ld = apCopy[++j]
31ad0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 78 74 4f  ;.        iNextO
31ae0 6c 64 20 3d 20 69 20 2b 20 21 6c 65 61 66 44 61  ld = i + !leafDa
31af0 74 61 20 2b 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c  ta + pOld->nCell
31b00 20 2b 20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   + pOld->nOverfl
31b10 6f 77 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ow;.        if( 
31b20 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  pOld->nOverflow 
31b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 76  ){.          nOv
31b40 65 72 66 6c 6f 77 20 3d 20 70 4f 6c 64 2d 3e 6e  erflow = pOld->n
31b50 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 20 20  Overflow;.      
31b60 20 20 20 20 69 4f 76 65 72 66 6c 6f 77 20 3d 20      iOverflow = 
31b70 69 20 2b 20 21 6c 65 61 66 44 61 74 61 20 2b 20  i + !leafData + 
31b80 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  pOld->aOvfl[0].i
31b90 64 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dx;.        }.  
31ba0 20 20 20 20 20 20 69 73 44 69 76 69 64 65 72 20        isDivider 
31bb0 3d 20 21 6c 65 61 66 44 61 74 61 3b 20 20 0a 20  = !leafData;  . 
31bc0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73       }..      as
31bd0 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77 3e 30  sert(nOverflow>0
31be0 20 7c 7c 20 69 4f 76 65 72 66 6c 6f 77 3c 69 20   || iOverflow<i 
31bf0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31c00 6e 4f 76 65 72 66 6c 6f 77 3c 32 20 7c 7c 20 70  nOverflow<2 || p
31c10 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64  Old->aOvfl[0].id
31c20 78 3d 3d 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 31  x==pOld->aOvfl[1
31c30 5d 2e 69 64 78 2d 31 29 3b 0a 20 20 20 20 20 20  ].idx-1);.      
31c40 61 73 73 65 72 74 28 6e 4f 76 65 72 66 6c 6f 77  assert(nOverflow
31c50 3c 33 20 7c 7c 20 70 4f 6c 64 2d 3e 61 4f 76 66  <3 || pOld->aOvf
31c60 6c 5b 31 5d 2e 69 64 78 3d 3d 70 4f 6c 64 2d 3e  l[1].idx==pOld->
31c70 61 4f 76 66 6c 5b 32 5d 2e 69 64 78 2d 31 29 3b  aOvfl[2].idx-1);
31c80 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 69 4f  .      if( i==iO
31c90 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
31ca0 20 20 20 69 73 44 69 76 69 64 65 72 20 3d 20 31     isDivider = 1
31cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 2d  ;.        if( (-
31cc0 2d 6e 4f 76 65 72 66 6c 6f 77 29 3e 30 20 29 7b  -nOverflow)>0 ){
31cd0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 76 65 72  .          iOver
31ce0 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 20 20 20 20  flow++;.        
31cf0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
31d00 20 69 66 28 20 69 3d 3d 63 6e 74 4e 65 77 5b 6b   if( i==cntNew[k
31d10 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
31d20 43 65 6c 6c 20 69 20 69 73 20 74 68 65 20 63 65  Cell i is the ce
31d30 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ll immediately f
31d40 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 61 73  ollowing the las
31d50 74 20 63 65 6c 6c 20 6f 6e 20 6e 65 77 0a 20 20  t cell on new.  
31d60 20 20 20 20 20 20 2a 2a 20 73 69 62 6c 69 6e 67        ** sibling
31d70 20 70 61 67 65 20 6b 2e 20 49 66 20 74 68 65 20   page k. If the 
31d80 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74  siblings are not
31d90 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66 20 61   leaf pages of a
31da0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74  n.        ** int
31db0 6b 65 79 20 62 2d 74 72 65 65 2c 20 74 68 65 6e  key b-tree, then
31dc0 20 63 65 6c 6c 20 69 20 69 73 20 61 20 64 69 76   cell i is a div
31dd0 69 64 65 72 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  ider cell.  */. 
31de0 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70         pNew = ap
31df0 4e 65 77 5b 2b 2b 6b 5d 3b 0a 20 20 20 20 20 20  New[++k];.      
31e00 20 20 69 66 28 20 21 6c 65 61 66 44 61 74 61 20    if( !leafData 
31e10 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
31e20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
31e30 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31e40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31e50 20 6a 3c 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 20   j<nOld );.     
31e60 20 61 73 73 65 72 74 28 20 6b 3c 6e 4e 65 77 20   assert( k<nNew 
31e70 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
31e80 74 68 65 20 63 65 6c 6c 20 77 61 73 20 6f 72 69  the cell was ori
31e90 67 69 6e 61 6c 6c 79 20 64 69 76 69 64 65 72 20  ginally divider 
31ea0 63 65 6c 6c 20 28 61 6e 64 20 69 73 20 6e 6f 74  cell (and is not
31eb0 20 6e 6f 77 29 20 6f 72 0a 20 20 20 20 20 20 2a   now) or.      *
31ec0 2a 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65  * an overflow ce
31ed0 6c 6c 2c 20 6f 72 20 69 66 20 74 68 65 20 63 65  ll, or if the ce
31ee0 6c 6c 20 77 61 73 20 6c 6f 63 61 74 65 64 20 6f  ll was located o
31ef0 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 69  n a different si
31f00 62 6c 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 70  bling.      ** p
31f10 61 67 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  age before the b
31f20 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 6e 20 74  alancing, then t
31f30 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
31f40 6e 74 72 69 65 73 20 61 73 73 6f 63 69 61 74 65  ntries associate
31f50 64 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  d.      ** with 
31f60 61 6e 79 20 63 68 69 6c 64 20 6f 72 20 6f 76 65  any child or ove
31f70 72 66 6c 6f 77 20 70 61 67 65 73 20 6e 65 65 64  rflow pages need
31f80 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 20   to be updated. 
31f90 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
31fa0 44 69 76 69 64 65 72 20 7c 7c 20 70 4f 6c 64 2d  Divider || pOld-
31fb0 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e  >pgno!=pNew->pgn
31fc0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  o ){.        if(
31fd0 20 21 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e   !leafCorrection
31fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31ff0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
32000 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65 6c  , get4byte(apCel
32010 6c 5b 69 5d 29 2c 20 50 54 52 4d 41 50 5f 42 54  l[i]), PTRMAP_BT
32020 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
32030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32040 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 69      if( szCell[i
32050 5d 3e 70 4e 65 77 2d 3e 6d 69 6e 4c 6f 63 61 6c  ]>pNew->minLocal
32060 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
32070 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
32080 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
32090 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
320a0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  l[i]);.        }
320b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
320c0 20 20 20 20 69 66 28 20 21 6c 65 61 66 43 6f 72      if( !leafCor
320d0 72 65 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  rection ){.     
320e0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
320f0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 4e 65  LITE_OK && i<nNe
32100 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; i++){.       
32110 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
32120 0a 09 20 20 20 20 70 42 74 2c 20 67 65 74 34 62  ..    pBt, get4b
32130 79 74 65 28 26 61 70 4e 65 77 5b 69 5d 2d 3e 61  yte(&apNew[i]->a
32140 44 61 74 61 5b 38 5d 29 2c 20 50 54 52 4d 41 50  Data[8]), PTRMAP
32150 5f 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 69 5d  _BTREE, apNew[i]
32160 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
32170 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
32180 20 20 2f 2a 20 54 68 65 20 70 74 72 6d 61 70 43    /* The ptrmapC
32190 68 65 63 6b 50 61 67 65 73 28 29 20 63 6f 6e 74  heckPages() cont
321a0 61 69 6e 73 20 61 73 73 65 72 74 28 29 20 73 74  ains assert() st
321b0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 76 65  atements that ve
321c0 72 69 66 79 20 74 68 61 74 0a 20 20 20 20 2a 2a  rify that.    **
321d0 20 61 6c 6c 20 70 6f 69 6e 74 65 72 20 6d 61 70   all pointer map
321e0 20 70 61 67 65 73 20 61 72 65 20 73 65 74 20 63   pages are set c
321f0 6f 72 72 65 63 74 6c 79 2e 20 54 68 69 73 20 69  orrectly. This i
32200 73 20 68 65 6c 70 66 75 6c 20 77 68 69 6c 65 20  s helpful while 
32210 0a 20 20 20 20 2a 2a 20 64 65 62 75 67 67 69 6e  .    ** debuggin
32220 67 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  g. This is usual
32230 6c 79 20 64 69 73 61 62 6c 65 64 20 62 65 63 61  ly disabled beca
32240 75 73 65 20 61 20 63 6f 72 72 75 70 74 20 64 61  use a corrupt da
32250 74 61 62 61 73 65 20 6d 61 79 0a 20 20 20 20 2a  tabase may.    *
32260 2a 20 63 61 75 73 65 20 61 6e 20 61 73 73 65 72  * cause an asser
32270 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  t() statement to
32280 20 66 61 69 6c 2e 20 20 2a 2f 0a 20 20 20 20 70   fail.  */.    p
32290 74 72 6d 61 70 43 68 65 63 6b 50 61 67 65 73 28  trmapCheckPages(
322a0 61 70 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20  apNew, nNew);.  
322b0 20 20 70 74 72 6d 61 70 43 68 65 63 6b 50 61 67    ptrmapCheckPag
322c0 65 73 28 26 70 50 61 72 65 6e 74 2c 20 31 29 3b  es(&pParent, 1);
322d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61  .#endif.  }..  a
322e0 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
322f0 69 73 49 6e 69 74 20 29 3b 0a 20 20 54 52 41 43  isInit );.  TRAC
32300 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
32310 69 73 68 65 64 3a 20 6f 6c 64 3d 25 64 20 6e 65  ished: old=%d ne
32320 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22  w=%d cells=%d\n"
32330 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 6c 64  ,.          nOld
32340 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
32350 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61  ..  /*.  ** Clea
32360 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75 72  nup before retur
32370 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e  ning..  */.balan
32380 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73 71  ce_cleanup:.  sq
32390 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
323a0 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28  (apCell);.  for(
323b0 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b  i=0; i<nOld; i++
323c0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
323d0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
323e0 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  }.  for(i=0; i<n
323f0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  New; i++){.    r
32400 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e 65 77  eleasePage(apNew
32410 5b 69 5d 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  [i]);.  }..  ret
32420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
32430 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
32440 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
32450 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
32460 61 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  a b-tree structu
32470 72 65 20 69 73 0a 2a 2a 20 6f 76 65 72 66 75 6c  re is.** overful
32480 6c 20 28 68 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  l (has one or mo
32490 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
324a0 73 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  s)..**.** A new 
324b0 63 68 69 6c 64 20 70 61 67 65 20 69 73 20 61 6c  child page is al
324c0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
324d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
324e0 63 75 72 72 65 6e 74 20 72 6f 6f 74 0a 2a 2a 20  current root.** 
324f0 70 61 67 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20  page, including 
32500 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2c 20  overflow cells, 
32510 61 72 65 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  are copied into 
32520 74 68 65 20 63 68 69 6c 64 2e 20 54 68 65 20 72  the child. The r
32530 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 74  oot.** page is t
32540 68 65 6e 20 6f 76 65 72 77 72 69 74 74 65 6e 20  hen overwritten 
32550 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 20 65 6d  to make it an em
32560 70 74 79 20 70 61 67 65 20 77 69 74 68 20 74 68  pty page with th
32570 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 0a 2a  e right-child .*
32580 2a 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  * pointer pointi
32590 6e 67 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ng to the new pa
325a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  ge..**.** Before
325b0 20 72 65 74 75 72 6e 69 6e 67 2c 20 61 6c 6c 20   returning, all 
325c0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
325d0 69 65 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ies correspondin
325e0 67 20 74 6f 20 70 61 67 65 73 20 0a 2a 2a 20 74  g to pages .** t
325f0 68 61 74 20 74 68 65 20 6e 65 77 20 63 68 69 6c  hat the new chil
32600 64 2d 70 61 67 65 20 6e 6f 77 20 63 6f 6e 74 61  d-page now conta
32610 69 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ins pointers to 
32620 61 72 65 20 75 70 64 61 74 65 64 2e 20 54 68 65  are updated. The
32630 0a 2a 2a 20 65 6e 74 72 79 20 63 6f 72 72 65 73  .** entry corres
32640 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6e  ponding to the n
32650 65 77 20 72 69 67 68 74 2d 63 68 69 6c 64 20 70  ew right-child p
32660 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 72 6f  ointer of the ro
32670 6f 74 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 6c  ot.** page is al
32680 73 6f 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a  so updated..**.*
32690 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
326a0 20 2a 70 70 43 68 69 6c 64 20 69 73 20 73 65 74   *ppChild is set
326b0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 72 65   to contain a re
326c0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
326d0 68 69 6c 64 20 0a 2a 2a 20 70 61 67 65 20 61 6e  hild .** page an
326e0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  d SQLITE_OK is r
326f0 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73  eturned. In this
32700 20 63 61 73 65 20 74 68 65 20 63 61 6c 6c 65 72   case the caller
32710 20 69 73 20 72 65 71 75 69 72 65 64 0a 2a 2a 20   is required.** 
32720 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
32730 61 67 65 28 29 20 6f 6e 20 2a 70 70 43 68 69 6c  age() on *ppChil
32740 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 2e 20  d exactly once. 
32750 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
32760 72 73 2c 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20  rs,.** an error 
32770 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32780 20 61 6e 64 20 2a 70 70 43 68 69 6c 64 20 69 73   and *ppChild is
32790 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 73 74   set to 0..*/.st
327a0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
327b0 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67 65 20  _deeper(MemPage 
327c0 2a 70 52 6f 6f 74 2c 20 4d 65 6d 50 61 67 65 20  *pRoot, MemPage 
327d0 2a 2a 70 70 43 68 69 6c 64 29 7b 0a 20 20 69 6e  **ppChild){.  in
327e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32800 52 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  Return value fro
32810 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
32820 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 43  */.  MemPage *pC
32830 68 69 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20  hild = 0;       
32840 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
32850 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
32860 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
32870 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
32880 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
32890 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77  umber of the new
328a0 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
328b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
328c0 20 70 52 6f 6f 74 2d 3e 70 42 74 3b 20 20 20 20   pRoot->pBt;    
328d0 2f 2a 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a  /* The BTree */.
328e0 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
328f0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
32900 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32910 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
32920 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
32930 2f 2a 20 4d 61 6b 65 20 70 52 6f 6f 74 2c 20 74  /* Make pRoot, t
32940 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
32950 74 68 65 20 62 2d 74 72 65 65 2c 20 77 72 69 74  the b-tree, writ
32960 61 62 6c 65 2e 20 41 6c 6c 6f 63 61 74 65 20 61  able. Allocate a
32970 20 6e 65 77 20 0a 20 20 2a 2a 20 70 61 67 65 20   new .  ** page 
32980 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
32990 20 74 68 65 20 6e 65 77 20 72 69 67 68 74 2d 63   the new right-c
329a0 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2e 20 43  hild of pPage. C
329b0 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  opy the contents
329c0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6e 6f 64  .  ** of the nod
329d0 65 20 73 74 6f 72 65 64 20 6f 6e 20 70 52 6f 6f  e stored on pRoo
329e0 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 63  t into the new c
329f0 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  hild page..  */.
32a00 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
32a10 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
32a20 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
32a30 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c 20  pDbPage)).   || 
32a40 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32a50 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
32a60 67 65 28 70 42 74 2c 26 70 43 68 69 6c 64 2c 26  ge(pBt,&pChild,&
32a70 70 67 6e 6f 43 68 69 6c 64 2c 70 52 6f 6f 74 2d  pgnoChild,pRoot-
32a80 3e 70 67 6e 6f 2c 30 29 29 0a 20 20 20 7c 7c 20  >pgno,0)).   || 
32a90 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32aa0 20 63 6f 70 79 4e 6f 64 65 43 6f 6e 74 65 6e 74   copyNodeContent
32ab0 28 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 29 29  (pRoot, pChild))
32ac0 0a 20 20 20 7c 7c 20 28 49 53 41 55 54 4f 56 41  .   || (ISAUTOVA
32ad0 43 55 55 4d 20 26 26 20 0a 20 20 20 20 20 20 20  CUUM && .       
32ae0 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32af0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
32b00 70 67 6e 6f 43 68 69 6c 64 2c 20 50 54 52 4d 41  pgnoChild, PTRMA
32b10 50 5f 42 54 52 45 45 2c 20 70 52 6f 6f 74 2d 3e  P_BTREE, pRoot->
32b20 70 67 6e 6f 29 29 29 0a 20 20 29 7b 0a 20 20 20  pgno))).  ){.   
32b30 20 2a 70 70 43 68 69 6c 64 20 3d 20 30 3b 0a 20   *ppChild = 0;. 
32b40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32b50 43 68 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75  Child);.    retu
32b60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
32b70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32b80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
32b90 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
32ba0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32bb0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
32bc0 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
32bd0 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
32be0 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
32bf0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Root->nCell );..
32c00 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
32c10 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20  E: copy root %d 
32c20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 52 6f 6f  into %d\n", pRoo
32c30 74 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d  t->pgno, pChild-
32c40 3e 70 67 6e 6f 29 29 3b 0a 0a 20 20 2f 2a 20 43  >pgno));..  /* C
32c50 6f 70 79 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  opy the overflow
32c60 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 52 6f 6f   cells from pRoo
32c70 74 20 74 6f 20 70 43 68 69 6c 64 20 2a 2f 0a 20  t to pChild */. 
32c80 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
32c90 61 4f 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 61 4f  aOvfl, pRoot->aO
32ca0 76 66 6c 2c 20 70 52 6f 6f 74 2d 3e 6e 4f 76 65  vfl, pRoot->nOve
32cb0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 52 6f  rflow*sizeof(pRo
32cc0 6f 74 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ot->aOvfl[0]));.
32cd0 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
32ce0 6c 6f 77 20 3d 20 70 52 6f 6f 74 2d 3e 6e 4f 76  low = pRoot->nOv
32cf0 65 72 66 6c 6f 77 3b 0a 0a 20 20 2f 2a 20 5a 65  erflow;..  /* Ze
32d00 72 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ro the contents 
32d10 6f 66 20 70 52 6f 6f 74 2e 20 54 68 65 6e 20 69  of pRoot. Then i
32d20 6e 73 74 61 6c 6c 20 70 43 68 69 6c 64 20 61 73  nstall pChild as
32d30 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
32d40 2e 20 2a 2f 0a 20 20 7a 65 72 6f 50 61 67 65 28  . */.  zeroPage(
32d50 70 52 6f 6f 74 2c 20 70 43 68 69 6c 64 2d 3e 61  pRoot, pChild->a
32d60 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c  Data[0] & ~PTF_L
32d70 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65  EAF);.  put4byte
32d80 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
32d90 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
32da0 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a  8], pgnoChild);.
32db0 0a 20 20 2a 70 70 43 68 69 6c 64 20 3d 20 70 43  .  *ppChild = pC
32dc0 68 69 6c 64 3b 0a 20 20 72 65 74 75 72 6e 20 53  hild;.  return S
32dd0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
32de0 2a 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74  ** The page that
32df0 20 70 43 75 72 20 63 75 72 72 65 6e 74 6c 79 20   pCur currently 
32e00 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 6a 75  points to has ju
32e10 73 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  st been modified
32e20 20 69 6e 0a 2a 2a 20 73 6f 6d 65 20 77 61 79 2e   in.** some way.
32e30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   This function f
32e40 69 67 75 72 65 73 20 6f 75 74 20 69 66 20 74 68  igures out if th
32e50 69 73 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20  is modification 
32e60 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 74 72 65  means the.** tre
32e70 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
32e80 6c 61 6e 63 65 64 2c 20 61 6e 64 20 69 66 20 73  lanced, and if s
32e90 6f 20 63 61 6c 6c 73 20 74 68 65 20 61 70 70 72  o calls the appr
32ea0 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
32eb0 67 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 2e 20 42  g .** routine. B
32ec0 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e 65  alancing routine
32ed0 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 62  s are:.**.**   b
32ee0 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 0a 2a  alance_quick().*
32ef0 2a 20 20 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  *   balance_deep
32f00 65 72 28 29 0a 2a 2a 20 20 20 62 61 6c 61 6e 63  er().**   balanc
32f10 65 5f 6e 6f 6e 72 6f 6f 74 28 29 0a 2a 2f 0a 73  e_nonroot().*/.s
32f20 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
32f30 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
32f40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
32f50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 6f 6e 73 74  LITE_OK;.  const
32f60 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 70 43 75 72   int nMin = pCur
32f70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
32f80 65 20 2a 20 32 20 2f 20 33 3b 0a 20 20 75 38 20  e * 2 / 3;.  u8 
32f90 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
32fa0 63 65 5b 31 33 5d 3b 0a 20 20 75 38 20 2a 70 46  ce[13];.  u8 *pF
32fb0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 54 45 53 54  ree = 0;..  TEST
32fc0 4f 4e 4c 59 28 20 69 6e 74 20 62 61 6c 61 6e 63  ONLY( int balanc
32fd0 65 5f 71 75 69 63 6b 5f 63 61 6c 6c 65 64 20 3d  e_quick_called =
32fe0 20 30 20 29 3b 0a 20 20 54 45 53 54 4f 4e 4c 59   0 );.  TESTONLY
32ff0 28 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 64 65  ( int balance_de
33000 65 70 65 72 5f 63 61 6c 6c 65 64 20 3d 20 30 20  eper_called = 0 
33010 29 3b 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  );..  do {.    i
33020 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
33030 3e 69 50 61 67 65 3b 0a 20 20 20 20 4d 65 6d 50  >iPage;.    MemP
33040 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
33050 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
33060 3b 0a 0a 20 20 20 20 69 66 28 20 69 50 61 67 65  ;..    if( iPage
33070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
33080 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
33090 77 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  w ){.        /* 
330a0 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  The root page of
330b0 20 74 68 65 20 62 2d 74 72 65 65 20 69 73 20 6f   the b-tree is o
330c0 76 65 72 66 75 6c 6c 2e 20 49 6e 20 74 68 69 73  verfull. In this
330d0 20 63 61 73 65 20 63 61 6c 6c 20 74 68 65 0a 20   case call the. 
330e0 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
330f0 65 5f 64 65 65 70 65 72 28 29 20 66 75 6e 63 74  e_deeper() funct
33100 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61 20  ion to create a 
33110 6e 65 77 20 63 68 69 6c 64 20 66 6f 72 20 74 68  new child for th
33120 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
33130 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 70 79 20      ** and copy 
33140 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
33150 65 6e 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74  ents of the root
33160 2d 70 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  -page to it. The
33170 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 78 74  .        ** next
33180 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
33190 65 20 64 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62  e do-loop will b
331a0 61 6c 61 6e 63 65 20 74 68 65 20 63 68 69 6c 64  alance the child
331b0 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a   page..        *
331c0 2f 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  / .        asser
331d0 74 28 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70  t( (balance_deep
331e0 65 72 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  er_called++)==0 
331f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
33200 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
33210 50 61 67 65 2c 20 26 70 43 75 72 2d 3e 61 70 50  Page, &pCur->apP
33220 61 67 65 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  age[1]);.       
33230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
33240 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
33250 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 31 3b  pCur->iPage = 1;
33260 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
33270 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20  >aiIdx[0] = 0;. 
33280 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61           pCur->a
33290 69 49 64 78 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[1] = 0;.   
332a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
332b0 43 75 72 2d 3e 61 70 50 61 67 65 5b 31 5d 2d 3e  Cur->apPage[1]->
332c0 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 20  nOverflow );.   
332d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
332e0 73 65 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61  se{.        brea
332f0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
33300 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 2d 3e  else if( pPage->
33310 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
33320 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 6e 4d  pPage->nFree<=nM
33330 69 6e 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  in ){.      brea
33340 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
33350 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 20 63 6f      MemPage * co
33360 6e 73 74 20 70 50 61 72 65 6e 74 20 3d 20 70 43  nst pParent = pC
33370 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
33380 2d 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  -1];.      int c
33390 6f 6e 73 74 20 69 49 64 78 20 3d 20 70 43 75 72  onst iIdx = pCur
333a0 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 2d 31 5d  ->aiIdx[iPage-1]
333b0 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ;..      rc = sq
333c0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
333d0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
333e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
333f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69  =SQLITE_OK ){.#i
33400 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
33410 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
33420 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
33430 2d 3e 68 61 73 44 61 74 61 0a 20 20 20 20 20 20  ->hasData.      
33440 20 20 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76     && pPage->nOv
33450 65 72 66 6c 6f 77 3d 3d 31 0a 20 20 20 20 20 20  erflow==1.      
33460 20 20 20 26 26 20 70 50 61 67 65 2d 3e 61 4f 76     && pPage->aOv
33470 66 6c 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65  fl[0].idx==pPage
33480 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20 20 20 20  ->nCell.        
33490 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
334a0 6f 21 3d 31 0a 20 20 20 20 20 20 20 20 20 26 26  o!=1.         &&
334b0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
334c0 3d 69 49 64 78 0a 20 20 20 20 20 20 20 20 29 7b  =iIdx.        ){
334d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  .          /* Ca
334e0 6c 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  ll balance_quick
334f0 28 29 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  () to create a n
33500 65 77 20 73 69 62 6c 69 6e 67 20 6f 66 20 70 50  ew sibling of pP
33510 61 67 65 20 6f 6e 20 77 68 69 63 68 0a 20 20 20  age on which.   
33520 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 74 6f         ** to sto
33530 72 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  re the overflow 
33540 63 65 6c 6c 2e 20 62 61 6c 61 6e 63 65 5f 71 75  cell. balance_qu
33550 69 63 6b 28 29 20 69 6e 73 65 72 74 73 20 61 20  ick() inserts a 
33560 6e 65 77 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  new cell.       
33570 20 20 20 2a 2a 20 69 6e 74 6f 20 70 50 61 72 65     ** into pPare
33580 6e 74 2c 20 77 68 69 63 68 20 6d 61 79 20 63 61  nt, which may ca
33590 75 73 65 20 70 50 61 72 65 6e 74 20 6f 76 65 72  use pParent over
335a0 66 6c 6f 77 2e 20 49 66 20 74 68 69 73 0a 20 20  flow. If this.  
335b0 20 20 20 20 20 20 20 20 2a 2a 20 68 61 70 70 65          ** happe
335c0 6e 73 2c 20 74 68 65 20 6e 65 78 74 20 69 6e 74  ns, the next int
335d0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  eration of the d
335e0 6f 2d 6c 6f 6f 70 20 77 69 6c 6c 20 62 61 6c 61  o-loop will bala
335f0 6e 63 65 20 70 50 61 72 65 6e 74 20 0a 20 20 20  nce pParent .   
33600 20 20 20 20 20 20 20 2a 2a 20 75 73 65 20 65 69         ** use ei
33610 74 68 65 72 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  ther balance_non
33620 72 6f 6f 74 28 29 20 6f 72 20 62 61 6c 61 6e 63  root() or balanc
33630 65 5f 64 65 65 70 65 72 28 29 2e 20 55 6e 74 69  e_deeper(). Unti
33640 6c 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  l this.         
33650 20 2a 2a 20 68 61 70 70 65 6e 73 2c 20 74 68 65   ** happens, the
33660 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 69   overflow cell i
33670 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  s stored in the 
33680 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
33690 63 65 5b 5d 0a 20 20 20 20 20 20 20 20 20 20 2a  ce[].          *
336a0 2a 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 20  * buffer. .     
336b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
336c0 20 20 2a 2a 20 54 68 65 20 70 75 72 70 6f 73 65    ** The purpose
336d0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
336e0 67 20 61 73 73 65 72 74 28 29 20 69 73 20 74 6f  g assert() is to
336f0 20 63 68 65 63 6b 20 74 68 61 74 20 6f 6e 6c 79   check that only
33700 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
33710 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f 20 62  single call to b
33720 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
33730 73 20 6d 61 64 65 20 66 6f 72 20 65 61 63 68 20  s made for each 
33740 63 61 6c 6c 20 74 6f 20 74 68 69 73 0a 20 20 20  call to this.   
33750 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
33760 6f 6e 2e 20 49 66 20 74 68 69 73 20 77 65 72 65  on. If this were
33770 20 6e 6f 74 20 76 65 72 69 66 69 65 64 2c 20 61   not verified, a
33780 20 73 75 62 74 6c 65 20 62 75 67 20 69 6e 76 6f   subtle bug invo
33790 6c 76 69 6e 67 20 72 65 75 73 65 0a 20 20 20 20  lving reuse.    
337a0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
337b0 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
337c0 63 65 5b 5d 20 6d 69 67 68 74 20 73 6e 65 61 6b  ce[] might sneak
337d0 20 69 6e 2e 0a 20 20 20 20 20 20 20 20 20 20 2a   in..          *
337e0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
337f0 72 74 28 20 28 62 61 6c 61 6e 63 65 5f 71 75 69  rt( (balance_qui
33800 63 6b 5f 63 61 6c 6c 65 64 2b 2b 29 3d 3d 30 20  ck_called++)==0 
33810 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
33820 3d 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  = balance_quick(
33830 70 50 61 72 65 6e 74 2c 20 70 50 61 67 65 2c 20  pParent, pPage, 
33840 61 42 61 6c 61 6e 63 65 51 75 69 63 6b 53 70 61  aBalanceQuickSpa
33850 63 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ce);.        }el
33860 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
33870 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a    {.          /*
33880 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 63   In this case, c
33890 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  all balance_nonr
338a0 6f 6f 74 28 29 20 74 6f 20 72 65 64 69 73 74 72  oot() to redistr
338b0 69 62 75 74 65 20 63 65 6c 6c 73 0a 20 20 20 20  ibute cells.    
338c0 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e        ** between
338d0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
338e0 20 32 20 6f 66 20 69 74 73 20 73 69 62 6c 69 6e   2 of its siblin
338f0 67 20 70 61 67 65 73 2e 20 54 68 69 73 20 69 6e  g pages. This in
33900 76 6f 6c 76 65 73 0a 20 20 20 20 20 20 20 20 20  volves.         
33910 20 2a 2a 20 6d 6f 64 69 66 79 69 6e 67 20 74 68   ** modifying th
33920 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
33930 61 72 65 6e 74 2c 20 77 68 69 63 68 20 6d 61 79  arent, which may
33940 20 63 61 75 73 65 20 70 50 61 72 65 6e 74 20 74   cause pParent t
33950 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  o.          ** b
33960 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20 6f  ecome overfull o
33970 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 54 68 65  r underfull. The
33980 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
33990 6f 66 20 74 68 65 20 64 6f 2d 6c 6f 6f 70 0a 20  of the do-loop. 
339a0 20 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c           ** will
339b0 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72   balance the par
339c0 65 6e 74 20 70 61 67 65 20 74 6f 20 63 6f 72 72  ent page to corr
339d0 65 63 74 20 74 68 69 73 2e 0a 20 20 20 20 20 20  ect this..      
339e0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
339f0 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 72 65    ** If the pare
33a00 6e 74 20 70 61 67 65 20 62 65 63 6f 6d 65 73 20  nt page becomes 
33a10 6f 76 65 72 66 75 6c 6c 2c 20 74 68 65 20 6f 76  overfull, the ov
33a20 65 72 66 6c 6f 77 20 63 65 6c 6c 20 6f 72 20 63  erflow cell or c
33a30 65 6c 6c 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ells.          *
33a40 2a 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  * are stored in 
33a50 74 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  the pSpace buffe
33a60 72 20 61 6c 6c 6f 63 61 74 65 64 20 69 6d 6d 65  r allocated imme
33a70 64 69 61 74 65 6c 79 20 62 65 6c 6f 77 2e 20 0a  diately below. .
33a80 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 20 73            ** A s
33a90 75 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74  ubsequent iterat
33aa0 69 6f 6e 20 6f 66 20 74 68 65 20 64 6f 2d 6c 6f  ion of the do-lo
33ab0 6f 70 20 77 69 6c 6c 20 64 65 61 6c 20 77 69 74  op will deal wit
33ac0 68 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20  h this by.      
33ad0 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 62      ** calling b
33ae0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33af0 20 28 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72   (balance_deeper
33b00 28 29 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  () may be called
33b10 20 66 69 72 73 74 2c 0a 20 20 20 20 20 20 20 20   first,.        
33b20 20 20 2a 2a 20 62 75 74 20 69 74 20 64 6f 65 73    ** but it does
33b30 6e 27 74 20 64 65 61 6c 20 77 69 74 68 20 6f 76  n't deal with ov
33b40 65 72 66 6c 6f 77 20 63 65 6c 6c 73 20 2d 20 6a  erflow cells - j
33b50 75 73 74 20 6d 6f 76 65 73 20 74 68 65 6d 20 74  ust moves them t
33b60 6f 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  o a.          **
33b70 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 29   different page)
33b80 2e 20 4f 6e 63 65 20 74 68 69 73 20 73 75 62 73  . Once this subs
33b90 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 20 62  equent call to b
33ba0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29  alance_nonroot()
33bb0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68   .          ** h
33bc0 61 73 20 63 6f 6d 70 6c 65 74 65 64 2c 20 69 74  as completed, it
33bd0 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 6c 65   is safe to rele
33be0 61 73 65 20 74 68 65 20 70 53 70 61 63 65 20 62  ase the pSpace b
33bf0 75 66 66 65 72 20 75 73 65 64 20 62 79 0a 20 20  uffer used by.  
33c00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
33c10 72 65 76 69 6f 75 73 20 63 61 6c 6c 2c 20 61 73  revious call, as
33c20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
33c30 6c 6c 20 64 61 74 61 20 77 69 6c 6c 20 68 61 76  ll data will hav
33c40 65 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20  e been .        
33c50 20 20 2a 2a 20 63 6f 70 69 65 64 20 65 69 74 68    ** copied eith
33c60 65 72 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  er into the body
33c70 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 70   of a database p
33c80 61 67 65 20 6f 72 20 69 6e 74 6f 20 74 68 65 20  age or into the 
33c90 6e 65 77 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  new.          **
33ca0 20 70 53 70 61 63 65 20 62 75 66 66 65 72 20 70   pSpace buffer p
33cb0 61 73 73 65 64 20 74 6f 20 74 68 65 20 6c 61 74  assed to the lat
33cc0 74 65 72 20 63 61 6c 6c 20 74 6f 20 62 61 6c 61  ter call to bala
33cd0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 29 2e 0a 20  nce_nonroot().. 
33ce0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
33cf0 20 20 20 20 20 20 75 38 20 2a 70 53 70 61 63 65        u8 *pSpace
33d00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
33d10 6c 6c 6f 63 28 70 43 75 72 2d 3e 70 42 74 2d 3e  lloc(pCur->pBt->
33d20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
33d30 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
33d40 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 72 65 6e  e_nonroot(pParen
33d50 74 2c 20 69 49 64 78 2c 20 70 53 70 61 63 65 2c  t, iIdx, pSpace,
33d60 20 69 50 61 67 65 3d 3d 31 29 3b 0a 20 20 20 20   iPage==1);.    
33d70 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
33d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
33d90 2a 20 49 66 20 70 46 72 65 65 20 69 73 20 6e 6f  * If pFree is no
33da0 74 20 4e 55 4c 4c 2c 20 69 74 20 70 6f 69 6e 74  t NULL, it point
33db0 73 20 74 6f 20 74 68 65 20 70 53 70 61 63 65 20  s to the pSpace 
33dc0 62 75 66 66 65 72 20 75 73 65 64 20 0a 20 20 20  buffer used .   
33dd0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20 61           ** by a
33de0 20 70 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74   previous call t
33df0 6f 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  o balance_nonroo
33e00 74 28 29 2e 20 49 74 73 20 63 6f 6e 74 65 6e 74  t(). Its content
33e10 73 20 61 72 65 0a 20 20 20 20 20 20 20 20 20 20  s are.          
33e20 20 20 2a 2a 20 6e 6f 77 20 73 74 6f 72 65 64 20    ** now stored 
33e30 65 69 74 68 65 72 20 6f 6e 20 72 65 61 6c 20 64  either on real d
33e40 61 74 61 62 61 73 65 20 70 61 67 65 73 20 6f 72  atabase pages or
33e50 20 77 69 74 68 69 6e 20 74 68 65 20 0a 20 20 20   within the .   
33e60 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 77 20           ** new 
33e70 70 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 73  pSpace buffer, s
33e80 6f 20 69 74 20 6d 61 79 20 62 65 20 73 61 66 65  o it may be safe
33e90 6c 79 20 66 72 65 65 64 20 68 65 72 65 2e 20 2a  ly freed here. *
33ea0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  /.            sq
33eb0 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70 46  lite3PageFree(pF
33ec0 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ree);.          
33ed0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
33ee0 54 68 65 20 70 53 70 61 63 65 20 62 75 66 66 65  The pSpace buffe
33ef0 72 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  r will be freed 
33f00 61 66 74 65 72 20 74 68 65 20 6e 65 78 74 20 63  after the next c
33f10 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 20  all to.         
33f20 20 2a 2a 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72   ** balance_nonr
33f30 6f 6f 74 28 29 2c 20 6f 72 20 6a 75 73 74 20 62  oot(), or just b
33f40 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e 63 74  efore this funct
33f50 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 77 68 69  ion returns, whi
33f60 63 68 65 76 65 72 0a 20 20 20 20 20 20 20 20 20  chever.         
33f70 20 2a 2a 20 63 6f 6d 65 73 20 66 69 72 73 74 2e   ** comes first.
33f80 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 46   */.          pF
33f90 72 65 65 20 3d 20 70 53 70 61 63 65 3b 0a 20 20  ree = pSpace;.  
33fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33fb0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
33fc0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
33fd0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
33fe0 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
33ff0 20 64 6f 2d 6c 6f 6f 70 20 62 61 6c 61 6e 63 65   do-loop balance
34000 73 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  s the parent pag
34010 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65  e. */.      rele
34020 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
34030 20 20 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67        pCur->iPag
34040 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  e--;.    }.  }wh
34050 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
34060 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 46 72  OK );..  if( pFr
34070 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
34080 33 50 61 67 65 46 72 65 65 28 70 46 72 65 65 29  3PageFree(pFree)
34090 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
340a0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  c;.}.../*.** Ins
340b0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
340c0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
340d0 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
340e0 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
340f0 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
34100 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
34110 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
34120 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
34130 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
34140 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
34150 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
34160 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
34170 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
34180 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
34190 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
341a0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
341b0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
341c0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
341d0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
341e0 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
341f0 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
34200 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
34210 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
34220 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
34230 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a  oth ignored..**.
34240 2a 2a 20 49 66 20 74 68 65 20 73 65 65 6b 52 65  ** If the seekRe
34250 73 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  sult parameter i
34260 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
34270 20 61 20 73 75 63 63 65 73 73 66 75 6c 20 63 61   a successful ca
34280 6c 6c 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ll to.** sqlite3
34290 42 74 72 65 65 4d 6f 76 65 74 6f 28 29 20 74 6f  BtreeMoveto() to
342a0 20 73 65 65 6b 20 63 75 72 73 6f 72 20 70 43 75   seek cursor pCu
342b0 72 20 74 6f 20 28 70 4b 65 79 2c 20 6e 4b 65 79  r to (pKey, nKey
342c0 29 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ) has already.**
342d0 20 62 65 65 6e 20 70 65 72 66 6f 72 6d 65 64 2e   been performed.
342e0 20 73 65 65 6b 52 65 73 75 6c 74 20 69 73 20 74   seekResult is t
342f0 68 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74  he search result
34300 20 72 65 74 75 72 6e 65 64 20 28 61 20 6e 65 67   returned (a neg
34310 61 74 69 76 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  ative.** number 
34320 69 66 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  if pCur points a
34330 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  t an entry that 
34340 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
34350 28 70 4b 65 79 2c 20 6e 4b 65 79 29 2c 20 6f 72  (pKey, nKey), or
34360 0a 2a 2a 20 61 20 70 6f 73 69 74 69 76 65 20 76  .** a positive v
34370 61 6c 75 65 20 69 66 20 70 43 75 72 20 70 6f 69  alue if pCur poi
34380 6e 74 73 20 61 74 20 61 6e 20 65 74 72 79 20 74  nts at an etry t
34390 68 61 74 20 69 73 20 6c 61 72 67 65 72 20 74 68  hat is larger th
343a0 61 6e 20 0a 2a 2a 20 28 70 4b 65 79 2c 20 6e 4b  an .** (pKey, nK
343b0 65 79 29 29 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ey)). .**.** If 
343c0 74 68 65 20 73 65 65 6b 52 65 73 75 6c 74 20 70  the seekResult p
343d0 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74  arameter is 0, t
343e0 68 65 6e 20 63 75 72 73 6f 72 20 70 43 75 72 20  hen cursor pCur 
343f0 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 6e 79  may point to any
34400 20 0a 2a 2a 20 65 6e 74 72 79 20 6f 72 20 74 6f   .** entry or to
34410 20 6e 6f 20 65 6e 74 72 79 20 61 74 20 61 6c 6c   no entry at all
34420 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
34430 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  his function has
34440 20 74 6f 20 73 65 65 6b 0a 2a 2a 20 74 68 65 20   to seek.** the 
34450 63 75 72 73 6f 72 20 62 65 66 6f 72 65 20 74 68  cursor before th
34460 65 20 6e 65 77 20 6b 65 79 20 63 61 6e 20 62 65  e new key can be
34470 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
34480 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
34490 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f 72  sert(.  BtCursor
344a0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
344b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72 74         /* Insert
344c0 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20 74   data into the t
344d0 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75 72  able of this cur
344e0 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  sor */.  const v
344f0 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e  oid *pKey, i64 n
34500 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b  Key,    /* The k
34510 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65  ey of the new re
34520 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
34530 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
34540 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65 20   nData,  /* The 
34550 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77 20  data of the new 
34560 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
34570 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
34580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
34590 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30 20  mber of extra 0 
345a0 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64 20  bytes to append 
345b0 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  to data */.  int
345c0 20 61 70 70 65 6e 64 42 69 61 73 2c 20 20 20 20   appendBias,    
345d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
345e0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 6c  rue if this is l
345f0 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64 20  ikely an append 
34600 2a 2f 0a 20 20 69 6e 74 20 73 65 65 6b 52 65 73  */.  int seekRes
34610 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
34620 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
34630 20 70 72 69 6f 72 20 73 71 6c 69 74 65 33 42 74   prior sqlite3Bt
34640 72 65 65 4d 6f 76 65 74 6f 28 29 20 63 61 6c 6c  reeMoveto() call
34650 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
34660 0a 20 20 69 6e 74 20 6c 6f 63 20 3d 20 73 65 65  .  int loc = see
34670 6b 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 73  kResult;.  int s
34680 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69 64 78 3b  zNew;.  int idx;
34690 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
346a0 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  e;.  Btree *p = 
346b0 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
346c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
346d0 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e  p->pBt;.  unsign
346e0 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c 6c  ed char *oldCell
346f0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
34700 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b 0a  r *newCell = 0;.
34710 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
34720 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
34730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34740 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
34750 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n==TRANS_WRITE )
34760 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  ;.  assert( !pBt
34770 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20  ->readOnly );.  
34780 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 77 72  assert( pCur->wr
34790 46 6c 61 67 20 29 3b 0a 20 20 61 73 73 65 72 74  Flag );.  assert
347a0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
347b0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 70 43 75  TableLock(p, pCu
347c0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
347d0 72 2d 3e 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  r->pKeyInfo!=0, 
347e0 32 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  2) );..  /* If t
347f0 68 69 73 20 69 73 20 61 6e 20 69 6e 73 65 72 74  his is an insert
34800 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 62 2d   into a table b-
34810 74 72 65 65 2c 20 69 6e 76 61 6c 69 64 61 74 65  tree, invalidate
34820 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 0a 20   any incrblob . 
34830 20 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   ** cursors open
34840 20 6f 6e 20 74 68 65 20 72 6f 77 20 62 65 69 6e   on the row bein
34850 67 20 72 65 70 6c 61 63 65 64 20 28 61 73 73 75  g replaced (assu
34860 6d 69 6e 67 20 74 68 69 73 20 69 73 20 61 20 72  ming this is a r
34870 65 70 6c 61 63 65 0a 20 20 2a 2a 20 6f 70 65 72  eplace.  ** oper
34880 61 74 69 6f 6e 20 2d 20 69 66 20 69 74 20 69 73  ation - if it is
34890 20 6e 6f 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77   not, the follow
348a0 69 6e 67 20 69 73 20 61 20 6e 6f 2d 6f 70 29 2e  ing is a no-op).
348b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d    */.  if( pCur-
348c0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 20 29 7b 0a  >pKeyInfo==0 ){.
348d0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 49 6e      invalidateIn
348e0 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28 70 2c  crblobCursors(p,
348f0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
34900 20 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a   nKey, 0);.  }..
34910 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
34920 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
34930 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
34940 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a  Cur->skip;.  }..
34950 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
34960 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
34970 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
34980 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e  n on this table.
34990 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 73 6f  .  **.  ** In so
349a0 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 63 61  me cases, the ca
349b0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
349c0 65 65 4d 6f 76 65 74 6f 28 29 20 62 65 6c 6f 77  eeMoveto() below
349d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 46 6f 72   is a no-op. For
349e0 0a 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 77  .  ** example, w
349f0 68 65 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 61  hen inserting da
34a00 74 61 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ta into a table 
34a10 77 69 74 68 20 61 75 74 6f 2d 67 65 6e 65 72 61  with auto-genera
34a20 74 65 64 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a  ted integer.  **
34a30 20 6b 65 79 73 2c 20 74 68 65 20 56 44 42 45 20   keys, the VDBE 
34a40 6c 61 79 65 72 20 69 6e 76 6f 6b 65 73 20 73 71  layer invokes sq
34a50 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 29  lite3BtreeLast()
34a60 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
34a70 68 65 20 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  he .  ** integer
34a80 20 6b 65 79 20 74 6f 20 75 73 65 2e 20 49 74 20   key to use. It 
34a90 74 68 65 6e 20 63 61 6c 6c 73 20 74 68 69 73 20  then calls this 
34aa0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 63 74 75  function to actu
34ab0 61 6c 6c 79 20 69 6e 73 65 72 74 20 74 68 65 20  ally insert the 
34ac0 0a 20 20 2a 2a 20 64 61 74 61 20 69 6e 74 6f 20  .  ** data into 
34ad0 74 68 65 20 69 6e 74 6b 65 79 20 42 2d 54 72 65  the intkey B-Tre
34ae0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
34af0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
34b00 74 6f 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 0a  to() recognizes.
34b10 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75    ** that the cu
34b20 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
34b30 77 68 65 72 65 20 69 74 20 6e 65 65 64 73 20 74  where it needs t
34b40 6f 20 62 65 20 61 6e 64 20 72 65 74 75 72 6e 73  o be and returns
34b50 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 64 6f   without.  ** do
34b60 69 6e 67 20 61 6e 79 20 77 6f 72 6b 2e 20 54 6f  ing any work. To
34b70 20 61 76 6f 69 64 20 74 68 77 61 72 74 69 6e 67   avoid thwarting
34b80 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61 74   these optimizat
34b90 69 6f 6e 73 2c 20 69 74 20 69 73 20 69 6d 70 6f  ions, it is impo
34ba0 72 74 61 6e 74 0a 20 20 2a 2a 20 6e 6f 74 20 74  rtant.  ** not t
34bb0 6f 20 63 6c 65 61 72 20 74 68 65 20 63 75 72 73  o clear the curs
34bc0 6f 72 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  or here..  */.  
34bd0 69 66 28 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f  if(.    SQLITE_O
34be0 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41 6c 6c  K!=(rc = saveAll
34bf0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43 75  Cursors(pBt, pCu
34c00 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
34c10 72 29 29 20 7c 7c 20 28 21 6c 6f 63 20 26 26 0a  r)) || (!loc &&.
34c20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
34c30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
34c40 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b  eMoveto(pCur, pK
34c50 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64  ey, nKey, append
34c60 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29  Bias, &loc)).  )
34c70 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
34c80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
34c90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
34ca0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
34cb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
34cc0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 26 26 20 6c  SOR_INVALID && l
34cd0 6f 63 29 20 29 3b 0a 0a 20 20 70 50 61 67 65 20  oc) );..  pPage 
34ce0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
34cf0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
34d00 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
34d10 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20  tKey || nKey>=0 
34d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
34d30 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61  ge->leaf || !pPa
34d40 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ge->intKey );.  
34d50 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20  TRACE(("INSERT: 
34d60 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c  table=%d nkey=%l
34d70 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65  ld ndata=%d page
34d80 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
34d90 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
34da0 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61  oot, nKey, nData
34db0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20  , pPage->pgno,. 
34dc0 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20           loc==0 
34dd0 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20  ? "overwrite" : 
34de0 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20  "new entry"));. 
34df0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
34e00 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f  isInit );.  allo
34e10 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
34e20 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20  t);.  newCell = 
34e30 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
34e40 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30    if( newCell==0
34e50 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
34e60 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66  _NOMEM;.  rc = f
34e70 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c  illInCell(pPage,
34e80 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20   newCell, pKey, 
34e90 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61  nKey, pData, nDa
34ea0 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65  ta, nZero, &szNe
34eb0 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  w);.  if( rc ) g
34ec0 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a  oto end_insert;.
34ed0 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d    assert( szNew=
34ee0 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61  =cellSizePtr(pPa
34ef0 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a  ge, newCell) );.
34f00 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c    assert( szNew<
34f10 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42  =MX_CELL_SIZE(pB
34f20 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43  t) );.  idx = pC
34f30 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
34f40 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f  iPage];.  if( lo
34f50 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 31 36 20  c==0 ){.    u16 
34f60 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72  szOld;.    asser
34f70 74 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  t( idx<pPage->nC
34f80 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
34f90 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34fa0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
34fc0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
34fd0 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
34fe0 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
34ff0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
35000 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
35010 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
35020 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20  memcpy(newCell, 
35030 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20  oldCell, 4);.   
35040 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63   }.    szOld = c
35050 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
35060 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
35070 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
35080 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a  Page, oldCell);.
35090 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
350a0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
350b0 20 20 72 63 20 3d 20 64 72 6f 70 43 65 6c 6c 28    rc = dropCell(
350c0 70 50 61 67 65 2c 20 69 64 78 2c 20 73 7a 4f 6c  pPage, idx, szOl
350d0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  d);.    if( rc!=
350e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20  SQLITE_OK ) {.  
350f0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73      goto end_ins
35100 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ert;.    }.  }el
35110 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
35120 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
35130 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
35140 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
35150 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 61   idx = ++pCur->a
35160 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
35170 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
35180 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
35190 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  eaf );.  }.  rc 
351a0 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
351b0 67 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c  ge, idx, newCell
351c0 2c 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  , szNew, 0, 0);.
351d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
351e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
351f0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 70 50 61  ->nCell>0 || pPa
35200 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
35210 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 65  );..  /* If no e
35220 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64  rror has occured
35230 20 61 6e 64 20 70 50 61 67 65 20 68 61 73 20 61   and pPage has a
35240 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 2c  n overflow cell,
35250 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 28 29 20   call balance() 
35260 0a 20 20 2a 2a 20 74 6f 20 72 65 64 69 73 74 72  .  ** to redistr
35270 69 62 75 74 65 20 74 68 65 20 63 65 6c 6c 73 20  ibute the cells 
35280 77 69 74 68 69 6e 20 74 68 65 20 74 72 65 65 2e  within the tree.
35290 20 53 69 6e 63 65 20 62 61 6c 61 6e 63 65 28 29   Since balance()
352a0 20 6d 61 79 20 6d 6f 76 65 0a 20 20 2a 2a 20 74   may move.  ** t
352b0 68 65 20 63 75 72 73 6f 72 2c 20 7a 65 72 6f 20  he cursor, zero 
352c0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  the BtCursor.inf
352d0 6f 2e 6e 53 69 7a 65 20 61 6e 64 20 42 74 43 75  o.nSize and BtCu
352e0 72 73 6f 72 2e 76 61 6c 69 64 4e 4b 65 79 0a 20  rsor.validNKey. 
352f0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2e 0a 20   ** variables.. 
35300 20 2a 2a 0a 20 20 2a 2a 20 50 72 65 76 69 6f 75   **.  ** Previou
35310 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  s versions of SQ
35320 4c 69 74 65 20 63 61 6c 6c 65 64 20 6d 6f 76 65  Lite called move
35330 54 6f 52 6f 6f 74 28 29 20 74 6f 20 6d 6f 76 65  ToRoot() to move
35340 20 74 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a   the cursor.  **
35350 20 62 61 63 6b 20 74 6f 20 74 68 65 20 72 6f 6f   back to the roo
35360 74 20 70 61 67 65 20 61 73 20 62 61 6c 61 6e 63  t page as balanc
35370 65 28 29 20 75 73 65 64 20 74 6f 20 69 6e 76 61  e() used to inva
35380 6c 69 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65  lidate the conte
35390 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 42 74 43 75  nts.  ** of BtCu
353a0 72 73 6f 72 2e 61 70 50 61 67 65 5b 5d 20 61 6e  rsor.apPage[] an
353b0 64 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  d BtCursor.aiIdx
353c0 5b 5d 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64  []. Instead of d
353d0 6f 69 6e 67 20 74 68 61 74 2c 0a 20 20 2a 2a 20  oing that,.  ** 
353e0 73 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 73  set the cursor s
353f0 74 61 74 65 20 74 6f 20 22 69 6e 76 61 6c 69 64  tate to "invalid
35400 22 2e 20 54 68 69 73 20 6d 61 6b 65 73 20 63 6f  ". This makes co
35410 6d 6d 6f 6e 20 69 6e 73 65 72 74 20 6f 70 65 72  mmon insert oper
35420 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 73 6c 69 67  ations.  ** slig
35430 68 74 6c 79 20 66 61 73 74 65 72 2e 0a 20 20 2a  htly faster..  *
35440 2a 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20  *.  ** There is 
35450 61 20 73 75 62 74 6c 65 20 62 75 74 20 69 6d 70  a subtle but imp
35460 6f 72 74 61 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ortant optimizat
35470 69 6f 6e 20 68 65 72 65 20 74 6f 6f 2e 20 57 68  ion here too. Wh
35480 65 6e 20 69 6e 73 65 72 74 69 6e 67 0a 20 20 2a  en inserting.  *
35490 2a 20 6d 75 6c 74 69 70 6c 65 20 72 65 63 6f 72  * multiple recor
354a0 64 73 20 69 6e 74 6f 20 61 6e 20 69 6e 74 6b 65  ds into an intke
354b0 79 20 62 2d 74 72 65 65 20 75 73 69 6e 67 20 61  y b-tree using a
354c0 20 73 69 6e 67 6c 65 20 63 75 72 73 6f 72 20 28   single cursor (
354d0 61 73 20 63 61 6e 0a 20 20 2a 2a 20 68 61 70 70  as can.  ** happ
354e0 65 6e 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  en while process
354f0 69 6e 67 20 61 6e 20 22 49 4e 53 45 52 54 20 49  ing an "INSERT I
35500 4e 54 4f 20 2e 2e 2e 20 53 45 4c 45 43 54 22 20  NTO ... SELECT" 
35510 73 74 61 74 65 6d 65 6e 74 29 2c 20 69 74 0a 20  statement), it. 
35520 20 2a 2a 20 69 73 20 61 64 76 61 6e 74 61 67 65   ** is advantage
35530 6f 75 73 20 74 6f 20 6c 65 61 76 65 20 74 68 65  ous to leave the
35540 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   cursor pointing
35550 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
35560 72 79 20 69 6e 0a 20 20 2a 2a 20 74 68 65 20 62  ry in.  ** the b
35570 2d 74 72 65 65 20 69 66 20 70 6f 73 73 69 62 6c  -tree if possibl
35580 65 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  e. If the cursor
35590 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
355a0 67 20 74 6f 20 74 68 65 20 6c 61 73 74 0a 20 20  g to the last.  
355b0 2a 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ** entry in the 
355c0 74 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 6e  table, and the n
355d0 65 78 74 20 72 6f 77 20 69 6e 73 65 72 74 65 64  ext row inserted
355e0 20 68 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20   has an integer 
355f0 6b 65 79 0a 20 20 2a 2a 20 6c 61 72 67 65 72 20  key.  ** larger 
35600 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74  than the largest
35610 20 65 78 69 73 74 69 6e 67 20 6b 65 79 2c 20 69   existing key, i
35620 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
35630 20 69 6e 73 65 72 74 20 74 68 65 0a 20 20 2a 2a   insert the.  **
35640 20 72 6f 77 20 77 69 74 68 6f 75 74 20 73 65 65   row without see
35650 6b 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 2e  king the cursor.
35660 20 54 68 69 73 20 63 61 6e 20 62 65 20 61 20 62   This can be a b
35670 69 67 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62  ig performance b
35680 6f 6f 73 74 2e 0a 20 20 2a 2f 0a 20 20 70 43 75  oost..  */.  pCu
35690 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
356a0 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  0;.  pCur->valid
356b0 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20  NKey = 0;.  if( 
356c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
356d0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
356e0 77 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61  w ){.    rc = ba
356f0 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a 0a 20 20  lance(pCur);..  
35700 20 20 2f 2a 20 4d 75 73 74 20 6d 61 6b 65 20 73    /* Must make s
35710 75 72 65 20 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ure nOverflow is
35720 20 72 65 73 65 74 20 74 6f 20 7a 65 72 6f 20 65   reset to zero e
35730 76 65 6e 20 69 66 20 74 68 65 20 62 61 6c 61 6e  ven if the balan
35740 63 65 28 29 0a 20 20 20 20 2a 2a 20 66 61 69 6c  ce().    ** fail
35750 73 2e 20 49 6e 74 65 72 6e 61 6c 20 64 61 74 61  s. Internal data
35760 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75   structure corru
35770 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c  ption will resul
35780 74 20 6f 74 68 65 72 77 69 73 65 2e 20 0a 20 20  t otherwise. .  
35790 20 20 2a 2a 20 41 6c 73 6f 2c 20 73 65 74 20 74    ** Also, set t
357a0 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
357b0 74 6f 20 69 6e 76 61 6c 69 64 2e 20 54 68 69 73  to invalid. This
357c0 20 73 74 6f 70 73 20 73 61 76 65 43 75 72 73 6f   stops saveCurso
357d0 72 50 6f 73 69 74 69 6f 6e 28 29 0a 20 20 20 20  rPosition().    
357e0 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
357f0 6f 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  o save the curre
35800 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  nt position of t
35810 68 65 20 63 75 72 73 6f 72 2e 20 20 2a 2f 0a 20  he cursor.  */. 
35820 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
35830 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f  pCur->iPage]->nO
35840 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
35850 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
35860 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
35870 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
35880 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
35890 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76 65 72 66 6c  >iPage]->nOverfl
358a0 6f 77 3d 3d 30 20 29 3b 0a 0a 65 6e 64 5f 69 6e  ow==0 );..end_in
358b0 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
358c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
358d0 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
358e0 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
358f0 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
35900 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
35910 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
35920 61 20 61 72 62 69 74 72 61 72 79 20 6c 6f 63 61  a arbitrary loca
35930 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
35940 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
35950 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
35960 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
35970 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
35980 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
35990 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
359a0 20 20 20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20     .  int rc;   
359b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
359d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
359e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
359f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a00 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 64      /* Page to d
35a10 65 6c 65 74 65 20 63 65 6c 6c 20 66 72 6f 6d 20  elete cell from 
35a20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
35a30 61 72 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20  ar *pCell;      
35a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
35a50 6e 74 65 72 20 74 6f 20 63 65 6c 6c 20 74 6f 20  nter to cell to 
35a60 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
35a70 69 43 65 6c 6c 49 64 78 3b 20 20 20 20 20 20 20  iCellIdx;       
35a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 65 6c   /* Index of cel
35aa0 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  l to delete */. 
35ab0 20 69 6e 74 20 69 43 65 6c 6c 44 65 70 74 68 3b   int iCellDepth;
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ad0 20 20 20 20 20 20 2f 2a 20 44 65 70 74 68 20 6f        /* Depth o
35ae0 66 20 6e 6f 64 65 20 63 6f 6e 74 61 69 6e 69 6e  f node containin
35af0 67 20 70 43 65 6c 6c 20 2a 2f 20 0a 0a 20 20 61  g pCell */ ..  a
35b00 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35b10 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35b20 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
35b30 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
35b40 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
35b50 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
35b60 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 61 73 73 65  adOnly );.  asse
35b70 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
35b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 61   );.  assert( ha
35b90 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
35ba0 65 4c 6f 63 6b 28 70 2c 20 70 43 75 72 2d 3e 70  eLock(p, pCur->p
35bb0 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2d 3e 70  gnoRoot, pCur->p
35bc0 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 32 29 20 29  KeyInfo!=0, 2) )
35bd0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 68 61 73  ;.  assert( !has
35be0 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c  ReadConflicts(p,
35bf0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 29   pCur->pgnoRoot)
35c00 20 29 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52   );..  if( NEVER
35c10 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  (pCur->aiIdx[pCu
35c20 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d  r->iPage]>=pCur-
35c30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
35c40 61 67 65 5d 2d 3e 6e 43 65 6c 6c 29 20 0a 20 20  age]->nCell) .  
35c50 20 7c 7c 20 4e 45 56 45 52 28 70 43 75 72 2d 3e   || NEVER(pCur->
35c60 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
35c70 41 4c 49 44 29 0a 20 20 29 7b 0a 20 20 20 20 72  ALID).  ){.    r
35c80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35c90 4f 52 3b 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  OR;  /* Somethin
35ca0 67 20 68 61 73 20 67 6f 6e 65 20 61 77 72 79 2e  g has gone awry.
35cb0 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   */.  }..  /* If
35cc0 20 74 68 69 73 20 69 73 20 61 20 64 65 6c 65 74   this is a delet
35cd0 65 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 72  e operation to r
35ce0 65 6d 6f 76 65 20 61 20 72 6f 77 20 66 72 6f 6d  emove a row from
35cf0 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2c   a table b-tree,
35d00 0a 20 20 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  .  ** invalidate
35d10 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
35d20 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
35d30 65 20 72 6f 77 20 62 65 69 6e 67 20 64 65 6c 65  e row being dele
35d40 74 65 64 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ted.  */.  if( p
35d50 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
35d60 20 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61   ){.    invalida
35d70 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
35d80 73 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  s(p, pCur->pgnoR
35d90 6f 6f 74 2c 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  oot, pCur->info.
35da0 6e 4b 65 79 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  nKey, 0);.  }.. 
35db0 20 69 43 65 6c 6c 44 65 70 74 68 20 3d 20 70 43   iCellDepth = pC
35dc0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 69 43 65  ur->iPage;.  iCe
35dd0 6c 6c 49 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  llIdx = pCur->ai
35de0 49 64 78 5b 69 43 65 6c 6c 44 65 70 74 68 5d 3b  Idx[iCellDepth];
35df0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
35e00 3e 61 70 50 61 67 65 5b 69 43 65 6c 6c 44 65 70  >apPage[iCellDep
35e10 74 68 5d 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  th];.  pCell = f
35e20 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
35e30 43 65 6c 6c 49 64 78 29 3b 0a 0a 20 20 2f 2a 20  CellIdx);..  /* 
35e40 49 66 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  If the page cont
35e50 61 69 6e 69 6e 67 20 74 68 65 20 65 6e 74 72 79  aining the entry
35e60 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f   to delete is no
35e70 74 20 61 20 6c 65 61 66 20 70 61 67 65 2c 20 6d  t a leaf page, m
35e80 6f 76 65 0a 20 20 2a 2a 20 74 68 65 20 63 75 72  ove.  ** the cur
35e90 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 72 67 65  sor to the large
35ea0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
35eb0 74 72 65 65 20 74 68 61 74 20 69 73 20 73 6d 61  tree that is sma
35ec0 6c 6c 65 72 20 74 68 61 6e 0a 20 20 2a 2a 20 74  ller than.  ** t
35ed0 68 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 64  he entry being d
35ee0 65 6c 65 74 65 64 2e 20 54 68 69 73 20 63 65 6c  eleted. This cel
35ef0 6c 20 77 69 6c 6c 20 72 65 70 6c 61 63 65 20 74  l will replace t
35f00 68 65 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65  he cell being de
35f10 6c 65 74 65 64 0a 20 20 2a 2a 20 66 72 6f 6d 20  leted.  ** from 
35f20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
35f30 65 2e 20 54 68 65 20 27 70 72 65 76 69 6f 75 73  e. The 'previous
35f40 27 20 65 6e 74 72 79 20 69 73 20 75 73 65 64 20  ' entry is used 
35f50 66 6f 72 20 74 68 69 73 20 69 6e 73 74 65 61 64  for this instead
35f60 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 27 6e 65  .  ** of the 'ne
35f70 78 74 27 20 65 6e 74 72 79 2c 20 61 73 20 74 68  xt' entry, as th
35f80 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
35f90 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 61 72   is always a par
35fa0 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 75  t of the.  ** su
35fb0 62 2d 74 72 65 65 20 68 65 61 64 65 64 20 62 79  b-tree headed by
35fc0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
35fd0 6f 66 20 74 68 65 20 63 65 6c 6c 20 62 65 69 6e  of the cell bein
35fe0 67 20 64 65 6c 65 74 65 64 2e 20 54 68 69 73 20  g deleted. This 
35ff0 6d 61 6b 65 73 0a 20 20 2a 2a 20 62 61 6c 61 6e  makes.  ** balan
36000 63 69 6e 67 20 74 68 65 20 74 72 65 65 20 66 6f  cing the tree fo
36010 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 65 6c 65  llowing the dele
36020 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 65 61 73  te operation eas
36030 69 65 72 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21  ier.  */.  if( !
36040 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
36050 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
36060 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
36070 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
36080 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
36090 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 29 20 29  ur, &notUsed)) )
360a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
360b0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
360c0 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69  /* Save the posi
360d0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
360e0 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  er cursors open 
360f0 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 62 65  on this table be
36100 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6b 69 6e 67  fore.  ** making
36110 20 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f   any modificatio
36120 6e 73 2e 20 4d 61 6b 65 20 74 68 65 20 70 61 67  ns. Make the pag
36130 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
36140 20 65 6e 74 72 79 20 74 6f 20 62 65 20 0a 20 20   entry to be .  
36150 2a 2a 20 64 65 6c 65 74 65 64 20 77 72 69 74 61  ** deleted writa
36160 62 6c 65 2e 20 54 68 65 6e 20 66 72 65 65 20 61  ble. Then free a
36170 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
36180 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
36190 68 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 74 72  h the .  ** entr
361a0 79 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 72 65  y and finally re
361b0 6d 6f 76 65 20 74 68 65 20 63 65 6c 6c 20 69 74  move the cell it
361c0 73 65 6c 66 20 66 72 6f 6d 20 77 69 74 68 69 6e  self from within
361d0 20 74 68 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20   the page.  */. 
361e0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
361f0 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
36200 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
36210 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
36220 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
36230 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  !=(rc = sqlite3P
36240 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
36250 3e 70 44 62 50 61 67 65 29 29 0a 20 20 20 7c 7c  >pDbPage)).   ||
36260 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
36270 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
36280 65 2c 20 70 43 65 6c 6c 29 29 0a 20 20 20 7c 7c  e, pCell)).   ||
36290 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
362a0 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65  = dropCell(pPage
362b0 2c 20 69 43 65 6c 6c 49 64 78 2c 20 63 65 6c 6c  , iCellIdx, cell
362c0 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
362d0 43 65 6c 6c 29 29 29 0a 20 20 29 7b 0a 20 20 20  Cell))).  ){.   
362e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
362f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c  .  /* If the cel
36300 6c 20 64 65 6c 65 74 65 64 20 77 61 73 20 6e 6f  l deleted was no
36310 74 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 6c  t located on a l
36320 65 61 66 20 70 61 67 65 2c 20 74 68 65 6e 20 74  eaf page, then t
36330 68 65 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 69  he cursor.  ** i
36340 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
36350 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 72 67  ting to the larg
36360 65 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  est entry in the
36370 20 73 75 62 2d 74 72 65 65 20 68 65 61 64 65 64   sub-tree headed
36380 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 63 68 69  .  ** by the chi
36390 6c 64 2d 70 61 67 65 20 6f 66 20 74 68 65 20 63  ld-page of the c
363a0 65 6c 6c 20 74 68 61 74 20 77 61 73 20 6a 75 73  ell that was jus
363b0 74 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61  t deleted from a
363c0 6e 20 69 6e 74 65 72 6e 61 6c 0a 20 20 2a 2a 20  n internal.  ** 
363d0 6e 6f 64 65 2e 20 54 68 65 20 63 65 6c 6c 20 66  node. The cell f
363e0 72 6f 6d 20 74 68 65 20 6c 65 61 66 20 6e 6f 64  rom the leaf nod
363f0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6d 6f  e needs to be mo
36400 76 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ved to the inter
36410 6e 61 6c 0a 20 20 2a 2a 20 6e 6f 64 65 20 74 6f  nal.  ** node to
36420 20 72 65 70 6c 61 63 65 20 74 68 65 20 64 65 6c   replace the del
36430 65 74 65 64 20 63 65 6c 6c 2e 20 20 2a 2f 0a 20  eted cell.  */. 
36440 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
36450 66 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  f ){.    MemPage
36460 20 2a 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e   *pLeaf = pCur->
36470 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
36480 67 65 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  ge];.    int nCe
36490 6c 6c 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 20 3d  ll;.    Pgno n =
364a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 43   pCur->apPage[iC
364b0 65 6c 6c 44 65 70 74 68 2b 31 5d 2d 3e 70 67 6e  ellDepth+1]->pgn
364c0 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
364d0 63 68 61 72 20 2a 70 54 6d 70 3b 0a 0a 20 20 20  char *pTmp;..   
364e0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
364f0 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e  l(pLeaf, pLeaf->
36500 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 6e 43  nCell-1);.    nC
36510 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ell = cellSizePt
36520 72 28 70 4c 65 61 66 2c 20 70 43 65 6c 6c 29 3b  r(pLeaf, pCell);
36530 0a 20 20 20 20 61 73 73 65 72 74 28 20 4d 58 5f  .    assert( MX_
36540 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d  CELL_SIZE(pBt)>=
36550 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 20 20 61 6c  nCell );..    al
36560 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
36570 70 42 74 29 3b 0a 20 20 20 20 70 54 6d 70 20 3d  pBt);.    pTmp =
36580 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
36590 0a 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ..    if( SQLITE
365a0 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
365b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 65  e3PagerWrite(pLe
365c0 61 66 2d 3e 70 44 62 50 61 67 65 29 29 20 0a 20  af->pDbPage)) . 
365d0 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b      || SQLITE_OK
365e0 21 3d 28 72 63 20 3d 20 69 6e 73 65 72 74 43 65  !=(rc = insertCe
365f0 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 49  ll(pPage, iCellI
36600 64 78 2c 20 70 43 65 6c 6c 2d 34 2c 20 6e 43 65  dx, pCell-4, nCe
36610 6c 6c 2b 34 2c 20 70 54 6d 70 2c 20 6e 29 29 0a  ll+4, pTmp, n)).
36620 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f       || SQLITE_O
36630 4b 21 3d 28 72 63 20 3d 20 64 72 6f 70 43 65 6c  K!=(rc = dropCel
36640 6c 28 70 4c 65 61 66 2c 20 70 4c 65 61 66 2d 3e  l(pLeaf, pLeaf->
36650 6e 43 65 6c 6c 2d 31 2c 20 6e 43 65 6c 6c 29 29  nCell-1, nCell))
36660 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
36670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
36680 20 7d 0a 0a 20 20 2f 2a 20 42 61 6c 61 6e 63 65   }..  /* Balance
36690 20 74 68 65 20 74 72 65 65 2e 20 49 66 20 74 68   the tree. If th
366a0 65 20 65 6e 74 72 79 20 64 65 6c 65 74 65 64 20  e entry deleted 
366b0 77 61 73 20 6c 6f 63 61 74 65 64 20 6f 6e 20 61  was located on a
366c0 20 6c 65 61 66 20 70 61 67 65 2c 0a 20 20 2a 2a   leaf page,.  **
366d0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
366e0 20 73 74 69 6c 6c 20 70 6f 69 6e 74 73 20 74 6f   still points to
366f0 20 74 68 61 74 20 70 61 67 65 2e 20 49 6e 20 74   that page. In t
36700 68 69 73 20 63 61 73 65 20 74 68 65 20 66 69 72  his case the fir
36710 73 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  st.  ** call to 
36720 62 61 6c 61 6e 63 65 28 29 20 72 65 70 61 69 72  balance() repair
36730 73 20 74 68 65 20 74 72 65 65 2c 20 61 6e 64 20  s the tree, and 
36740 74 68 65 20 69 66 28 2e 2e 2e 29 20 63 6f 6e 64  the if(...) cond
36750 69 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 6e 65  ition is.  ** ne
36760 76 65 72 20 74 72 75 65 2e 0a 20 20 2a 2a 0a 20  ver true..  **. 
36770 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69   ** Otherwise, i
36780 66 20 74 68 65 20 65 6e 74 72 79 20 64 65 6c 65  f the entry dele
36790 74 65 64 20 77 61 73 20 6f 6e 20 61 6e 20 69 6e  ted was on an in
367a0 74 65 72 6e 61 6c 20 6e 6f 64 65 20 70 61 67 65  ternal node page
367b0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 70 43 75 72  , then.  ** pCur
367c0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
367d0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 72  the leaf page fr
367e0 6f 6d 20 77 68 69 63 68 20 61 20 63 65 6c 6c 20  om which a cell 
367f0 77 61 73 20 72 65 6d 6f 76 65 64 20 74 6f 0a 20  was removed to. 
36800 20 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 65 20   ** replace the 
36810 63 65 6c 6c 20 64 65 6c 65 74 65 64 20 66 72 6f  cell deleted fro
36820 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  m the internal n
36830 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69  ode. This is sli
36840 67 68 74 6c 79 0a 20 20 2a 2a 20 74 72 69 63 6b  ghtly.  ** trick
36850 79 20 61 73 20 74 68 65 20 6c 65 61 66 20 6e 6f  y as the leaf no
36860 64 65 20 6d 61 79 20 62 65 20 75 6e 64 65 72 66  de may be underf
36870 75 6c 6c 2c 20 61 6e 64 20 74 68 65 20 69 6e 74  ull, and the int
36880 65 72 6e 61 6c 20 6e 6f 64 65 20 6d 61 79 0a 20  ernal node may. 
36890 20 2a 2a 20 62 65 20 65 69 74 68 65 72 20 75 6e   ** be either un
368a0 64 65 72 20 6f 72 20 6f 76 65 72 66 75 6c 6c 2e  der or overfull.
368b0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 75   In this case ru
368c0 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 20  n the balancing 
368d0 61 6c 67 6f 72 69 74 68 6d 0a 20 20 2a 2a 20 6f  algorithm.  ** o
368e0 6e 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20  n the leaf node 
368f0 66 69 72 73 74 2e 20 49 66 20 74 68 65 20 62 61  first. If the ba
36900 6c 61 6e 63 65 20 70 72 6f 63 65 65 64 73 20 66  lance proceeds f
36910 61 72 20 65 6e 6f 75 67 68 20 75 70 20 74 68 65  ar enough up the
36920 0a 20 20 2a 2a 20 74 72 65 65 20 74 68 61 74 20  .  ** tree that 
36930 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  we can be sure t
36940 68 61 74 20 61 6e 79 20 70 72 6f 62 6c 65 6d 20  hat any problem 
36950 69 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  in the internal 
36960 6e 6f 64 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  node has.  ** be
36970 65 6e 20 63 6f 72 72 65 63 74 65 64 2c 20 73 6f  en corrected, so
36980 20 62 65 20 69 74 2e 20 4f 74 68 65 72 77 69 73   be it. Otherwis
36990 65 2c 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  e, after balanci
369a0 6e 67 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  ng the leaf node
369b0 2c 0a 20 20 2a 2a 20 77 61 6c 6b 20 74 68 65 20  ,.  ** walk the 
369c0 63 75 72 73 6f 72 20 75 70 20 74 68 65 20 74 72  cursor up the tr
369d0 65 65 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e  ee to the intern
369e0 61 6c 20 6e 6f 64 65 20 61 6e 64 20 62 61 6c 61  al node and bala
369f0 6e 63 65 20 69 74 20 61 73 20 0a 20 20 2a 2a 20  nce it as .  ** 
36a00 77 65 6c 6c 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  well.  */.  rc =
36a10 20 62 61 6c 61 6e 63 65 28 70 43 75 72 29 3b 0a   balance(pCur);.
36a20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36a30 5f 4f 4b 20 26 26 20 70 43 75 72 2d 3e 69 50 61  _OK && pCur->iPa
36a40 67 65 3e 69 43 65 6c 6c 44 65 70 74 68 20 29 7b  ge>iCellDepth ){
36a50 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
36a60 2d 3e 69 50 61 67 65 3e 69 43 65 6c 6c 44 65 70  ->iPage>iCellDep
36a70 74 68 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  th ){.      rele
36a80 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
36a90 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
36aa0 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  --]);.    }.    
36ab0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75  rc = balance(pCu
36ac0 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  r);.  }..  if( r
36ad0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36ae0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
36af0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
36b00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36b10 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
36b20 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
36b30 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
36b40 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
36b50 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
36b60 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
36b70 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
36b80 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
36b90 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
36ba0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
36bb0 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
36bc0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
36bd0 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
36be0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
36bf0 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
36c00 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
36c10 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
36c20 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
36c30 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
36c40 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
36c50 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
36c60 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
36c70 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
36c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36c90 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
36ca0 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ices.*/.static i
36cb0 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61  nt btreeCreateTa
36cc0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
36cd0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
36ce0 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
36cf0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
36d00 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
36d10 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
36d20 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  oot;.  int rc;..
36d30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
36d40 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
36d50 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
36d60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
36d70 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
36d80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
36d90 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
36da0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
36db0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
36dc0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
36dd0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
36de0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
36df0 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  1, 0);.  if( rc 
36e00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
36e10 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66  ;.  }.#else.  if
36e20 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36e30 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  m ){.    Pgno pg
36e40 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20  noMove;      /* 
36e50 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72 65  Move a page here
36e60 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
36e70 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
36e80 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  */.    MemPage *
36e90 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68  pPageMove; /* Th
36ea0 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  e page to move t
36eb0 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72  o. */..    /* Cr
36ec0 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62  eating a new tab
36ed0 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20  le may probably 
36ee0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
36ef0 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  n existing datab
36f00 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61  ase.    ** to ma
36f10 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20  ke room for the 
36f20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20  new tables root 
36f30 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68  page. In case th
36f40 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20  is page turns.  
36f50 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61    ** out to be a
36f60 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
36f70 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72   delete all over
36f80 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61  flow page-map ca
36f90 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64  ches.    ** held
36fa0 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73   by open cursors
36fb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76  ..    */.    inv
36fc0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
36fd0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20  owCache(pBt);.. 
36fe0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76     /* Read the v
36ff0 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20  alue of meta[3] 
37000 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
37010 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  e to determine w
37020 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  here the.    ** 
37030 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
37040 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c   new table shoul
37050 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73  d go. meta[3] is
37060 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
37070 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72  t-page.    ** cr
37080 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f  eated so far, so
37090 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61   the new root-pa
370a0 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31  ge is (meta[3]+1
370b0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
370c0 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
370d0 61 28 70 2c 20 42 54 52 45 45 5f 4c 41 52 47 45  a(p, BTREE_LARGE
370e0 53 54 5f 52 4f 4f 54 5f 50 41 47 45 2c 20 26 70  ST_ROOT_PAGE, &p
370f0 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 70 67  gnoRoot);.    pg
37100 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
37110 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
37120 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
37130 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
37140 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
37150 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
37160 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
37170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
37180 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
37190 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
371a0 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
371b0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
371c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
371d0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
371e0 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
371f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
37200 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
37210 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
37220 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
37230 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
37240 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
37250 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
37260 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
37270 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
37280 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
37290 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
372a0 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
372b0 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
372c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
372d0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
372e0 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
372f0 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
37300 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
37310 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37320 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
37330 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
37340 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
37350 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
37360 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
37370 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
37380 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
37390 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
373a0 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
373b0 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
373c0 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
373d0 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
373e0 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
373f0 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
37400 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
37410 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
37420 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
37430 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
37440 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
37450 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
37460 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
37470 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
37480 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
37490 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
374a0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
374b0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
374c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
374d0 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
374e0 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
374f0 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
37500 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
37510 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
37520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
37530 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
37540 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
37550 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
37560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
37570 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37580 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
37590 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
375a0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
375b0 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
375c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  e);.      if( eT
375d0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
375e0 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  PAGE || eType==P
375f0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
37600 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
37610 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
37620 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
37630 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
37640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37650 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
37660 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
37670 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
37680 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
37690 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
376a0 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
376b0 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
376c0 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20  P_FREEPAGE );.  
376d0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
376e0 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74  ePage(pBt, pRoot
376f0 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
37700 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b  e, pgnoMove, 0);
37710 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
37720 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
37730 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
37740 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
37750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
37760 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
37770 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
37780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37790 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
377a0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
377b0 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
377c0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
377d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
377e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
377f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37800 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
37810 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
37820 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
37830 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
37840 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
37850 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
37860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
37870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
37880 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
37890 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
378a0 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
378b0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
378c0 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
378d0 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
378e0 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
378f0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
37900 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
37910 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
37920 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
37930 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
37940 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
37950 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
37960 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
37970 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
37980 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
37990 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
379a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
379b0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
379c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
379d0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
379e0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
379f0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
37a00 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
37a10 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
37a20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
37a30 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
37a40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37a50 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37a60 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
37a70 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
37a80 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
37a90 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
37aa0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
37ab0 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
37ac0 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
37ad0 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
37ae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
37af0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
37b00 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
37b10 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
37b20 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
37b30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
37b40 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
37b50 70 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  p);.  rc = btree
37b60 43 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70  CreateTable(p, p
37b70 69 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a  iTable, flags);.
37b80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
37b90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
37ba0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
37bb0 61 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61  ase the given da
37bc0 74 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20  tabase page and 
37bd0 61 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e  all its children
37be0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
37bf0 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65   page to the fre
37c00 65 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elist..*/.static
37c10 20 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61   int clearDataba
37c20 73 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  sePage(.  BtShar
37c30 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
37c40 20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20     /* The BTree 
37c50 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
37c60 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e  e table */.  Pgn
37c70 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
37c80 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37c90 72 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20  r to clear */.  
37ca0 69 6e 74 20 66 72 65 65 50 61 67 65 46 6c 61 67  int freePageFlag
37cb0 2c 20 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63  ,     /* Dealloc
37cc0 61 74 65 20 70 61 67 65 20 69 66 20 74 72 75 65  ate page if true
37cd0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 68 61   */.  int *pnCha
37ce0 6e 67 65 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  nge.){.  MemPage
37cf0 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69   *pPage = 0;.  i
37d00 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
37d10 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20  d char *pCell;. 
37d20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73 73 65 72   int i;..  asser
37d30 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
37d40 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
37d50 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ) );.  if( pgno>
37d60 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
37d70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Bt) ){.    retur
37d80 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
37d90 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63  _BKPT;.  }..  rc
37da0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
37db0 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50  e(pBt, pgno, &pP
37dc0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
37dd0 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
37de0 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66  asepage_out;.  f
37df0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
37e00 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
37e10 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
37e20 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
37e30 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
37e40 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
37e50 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
37e60 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
37e70 28 70 43 65 6c 6c 29 2c 20 31 2c 20 70 6e 43 68  (pCell), 1, pnCh
37e80 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  ange);.      if(
37e90 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
37ea0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
37eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
37ec0 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
37ed0 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  , pCell);.    if
37ee0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
37ef0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
37f00 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50  t;.  }.  if( !pP
37f10 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
37f20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61 62   rc = clearDatab
37f30 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65 74  asePage(pBt, get
37f40 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
37f50 61 74 61 5b 38 5d 29 2c 20 31 2c 20 70 6e 43 68  ata[8]), 1, pnCh
37f60 61 6e 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  ange);.    if( r
37f70 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
37f80 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
37f90 20 20 7d 65 6c 73 65 20 69 66 28 20 70 6e 43 68    }else if( pnCh
37fa0 61 6e 67 65 20 29 7b 0a 20 20 20 20 61 73 73 65  ange ){.    asse
37fb0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
37fc0 79 20 29 3b 0a 20 20 20 20 2a 70 6e 43 68 61 6e  y );.    *pnChan
37fd0 67 65 20 2b 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge += pPage->nCe
37fe0 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72  ll;.  }.  if( fr
37ff0 65 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20  eePageFlag ){.  
38000 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
38010 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20  pPage);.  }else 
38020 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
38030 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
38040 65 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20  e->pDbPage))==0 
38050 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  ){.    zeroPage(
38060 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44  pPage, pPage->aD
38070 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41  ata[0] | PTF_LEA
38080 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61  F);.  }..clearda
38090 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a  tabasepage_out:.
380a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
380b0 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  age);.  return r
380c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
380d0 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  te all informati
380e0 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  on from a single
380f0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
38100 74 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20  tabase.  iTable 
38110 69 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  is.** the page n
38120 75 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f  umber of the roo
38130 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
38140 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
38150 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20  ine returns,.** 
38160 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
38170 20 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c   empty, but stil
38180 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  l exists..**.** 
38190 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
381a0 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
381b0 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
381c0 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
381d0 2a 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  ** read cursors 
381e0 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f  on the table.  O
381f0 70 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72  pen write cursor
38200 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74  s are moved to t
38210 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68  he.** root of th
38220 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
38230 66 20 70 6e 43 68 61 6e 67 65 20 69 73 20 6e 6f  f pnChange is no
38240 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 61 62  t NULL, then tab
38250 6c 65 20 69 54 61 62 6c 65 20 6d 75 73 74 20 62  le iTable must b
38260 65 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c  e an intkey tabl
38270 65 2e 20 54 68 65 0a 2a 2a 20 69 6e 74 65 67 65  e. The.** intege
38280 72 20 76 61 6c 75 65 20 70 6f 69 6e 74 65 64 20  r value pointed 
38290 74 6f 20 62 79 20 70 6e 43 68 61 6e 67 65 20 69  to by pnChange i
382a0 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 79  s incremented by
382b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
382c0 2a 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  * entries in the
382d0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
382e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
382f0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
38300 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
38310 2a 70 6e 43 68 61 6e 67 65 29 7b 0a 20 20 69 6e  *pnChange){.  in
38320 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
38330 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
38340 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
38350 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
38360 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
38370 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20  ANS_WRITE );..  
38380 2f 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c  /* Invalidate al
38390 6c 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  l incrblob curso
383a0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 61 62 6c 65  rs open on table
383b0 20 69 54 61 62 6c 65 20 28 61 73 73 75 6d 69 6e   iTable (assumin
383c0 67 20 69 54 61 62 6c 65 0a 20 20 2a 2a 20 69 73  g iTable.  ** is
383d0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 74   the root of a t
383e0 61 62 6c 65 20 62 2d 74 72 65 65 20 2d 20 69 66  able b-tree - if
383f0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 20   it is not, the 
38400 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 69  following call i
38410 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 29 2e  s.  ** a no-op).
38420 20 20 2a 2f 0a 20 20 69 6e 76 61 6c 69 64 61 74    */.  invalidat
38430 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73  eIncrblobCursors
38440 28 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 31  (p, iTable, 0, 1
38450 29 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  );..  if( SQLITE
38460 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK==(rc = saveA
38470 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 28  llCursors(pBt, (
38480 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 29 29  Pgno)iTable, 0))
38490 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65   ){.    rc = cle
384a0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
384b0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
384c0 2c 20 30 2c 20 70 6e 43 68 61 6e 67 65